explicit無しで宣言されたコンストラクタは意図しない暗黙の型変換を引き起こすのでexplicit付きで宣言する方がよい。
具体的には
#include <iostream> using namespace std; class A{ public: A(int val) { cout << val << endl; } }; class B{ public: B(const A&) { } }; int main(){ B(1); }
とした時に暗黙的に
B(A(1))
と変換されコンパイルされる(warningもでない)。意図しない挙動を引き起こすことがあるので
class B { explicit B(const A&); }
とするとコンパイルエラーになり暗黙的な変換を防ぐことができる。
参考文献
Effective C++ 第3版, スコット・メイヤーズ著