「密」のときと「密でない」ときで挙動が変わる C++ プログラム
実行
解説
&
の間の空白の有無によって異なる構文に解釈される。
- 密
-
a&&b
→a && b
→a.operator int() && b.operator int()
→1 && 1
→true
-
- 密でない
-
a & & b
→a & (&b)
→a.operator int() & (b.operator&())
→1 & 0
→false
-
if (初期化; 条件)
のように書けるのは C++17 からの文法。
ソースコード
# include <iostream>
struct X {
int operator & () { return 0; }
operator int () { return 1; }
};
int main()
{
if (X a,b;a&&b)
std::cout << "!!密!!\n";
else
std::cout << "密ではない\n";
std::cout << "------------\n";
if (X a, b; a & & b)
std::cout << "!!密!!\n";
else
std::cout << "密ではない\n";
}
!!密!!
------------
密ではない
教訓
- アドレス取得演算子を安易にオーバーロードしない
- 型変換演算子に
explicit
を付け、暗黙の型変換を禁止する。-
explicit operator int () { return 1; }
-
- ソースコードに Social Distancing を導入しない
Author And Source
この問題について(「密」のときと「密でない」ときで挙動が変わる C++ プログラム), 我々は、より多くの情報をここで見つけました https://qiita.com/Reputeless/items/b99846267c9b3b5021b3著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .