暗黙のキャスト

ロベールのC++入門講座 11-12

暗黙のキャストは思わぬバグを引き起こしてしまう可能性もあります。そのため、引数が一つになる可能性のあるコンストラクタがあれば、コピーコンストラクタを除いて、とりあえずはexplicitをつけておいたほうが無難です。

なるほど。確かにそうですね。

暗黙のキャストが怖いのは以下のケースです。

class CSample {
public:
    CSample (int num) {}
};

void func (CSample obj) {
}

int main () {
    // int型の10が暗黙のキャストでCSampleに置き換わる!
    func(10);
    return 0;
}

このfunc関数の呼び出しがエラーになりません。これは意図してそうする場合に問題はでないものの、非常に怖い挙動ですよね。

こういった暗黙のキャストをでないようにするためにexplicitをつけておきます。

class CSample {
public:
    explicit CSample (int num) {}
};

void func (CSample obj) {
}

int main () {
    // explicit指定されてるのでエラーになる
    func(10);
    return 0;
}
main.cpp(12) : error C2664: 'func' : 1 番目の引数を 'int' から 'CSample' に変換
できません。(新しい機能 ; ヘルプを参照)
        class 'CSample' のコンストラクタが 'explicit' と宣言されています。

活用したいと思います。