86

コンストラクターに関して言えば、キーワードを追加するとexplicit、プログラマーの最初の意図ではない場合に、熱心なコンパイラーがオブジェクトを作成するのを防ぐことができます。そのようなメカニズムは鋳造オペレーターにも利用できますか?

struct Foo
{
    operator std::string() const;
};

ここでは、たとえば、にキャストできるようにしFooたいstd::stringのですが、そのようなキャストが暗黙的に発生することは望ましくありません。

4

1 に答える 1

103

はいといいえ。

使用しているC++のバージョンによって異なります。

  • explicitC++98およびC++03は、型変換演算子をサポートしていません
  • しかし、C++11はそうします。

例、

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では、明示的な変換演算子は、ブール値に変換される場合、 「コンテキスト変換演算子」と呼ばれます。また、暗黙的および明示的な変換について詳しく知りたい場合は、次のトピックをお読みください。

お役に立てば幸いです。

于 2011-11-23T08:55:29.883 に答える