実行
解説
&
の間の空白の有無によって異なる構文に解釈される。
- 密
-
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 を導入しない