「密」のときと「密でない」ときで挙動が変わる C++ プログラム


実行

解説

& の間の空白の有無によって異なる構文に解釈される。

    • a&&ba && ba.operator int() && b.operator int()1 && 1true
  • 密でない
    • a & & ba & (&b)a.operator int() & (b.operator&())1 & 0false

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 を導入しない