コンストラクターに関しては、キーワードexplicit
を追加すると、プログラマーの最初の意図ではないときに、熱狂的なコンパイラーがオブジェクトを作成できなくなります。このようなメカニズムは、キャストオペレーターにも使用できますか?
struct Foo
{
operator std::string() const;
};
ここでは、たとえば、Foo
をstd::string
にキャストできるようにしたいと考えていますが、このようなキャストが暗黙的に行われるのは望ましくありません。
はいといいえ。
使用しているC++のバージョンによって異なります。
explicit
型変換演算子をサポートしていません例、
struct A
{
//implicit conversion to int
operator int() { return 100; }
//explicit conversion to std::string
explicit operator std::string() { return "explicit"; }
};
int main()
{
A a;
int i = a; //ok - implicit conversion
std::string s = a; //error - requires explicit conversion
}
g++ -std=c++0x
でコンパイルすると、このエラーが発生します:
prog.cpp:13:20:エラー: 'A'から非スカラータイプ 'std :: string'への変換が要求されました
オンラインデモ: http://ideone.com/DJut1
しかし、あなたが書いたらすぐに:
std::string s = static_cast<std::string>(a); //ok - explicit conversion
エラーは消えます: http://ideone.com/LhuFd
ところで、C++ 11では、明示的な変換演算子は、booleanに変換される場合、 "contextual conversion operator"と呼ばれます。 。また、暗黙的および明示的な変換について詳しく知りたい場合は、次のトピックをお読みください。
お役に立てば幸いです。