web-dev-qa-db-ja.com

キャスト演算子は明示的にできますか?

コンストラクターに関しては、キーワードexplicitを追加すると、プログラマーの最初の意図ではないときに、熱狂的なコンパイラーがオブジェクトを作成できなくなります。このようなメカニズムは、キャストオペレーターにも使用できますか?

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

ここでは、たとえば、Foostd::stringにキャストできるようにしたいと考えていますが、このようなキャストが暗黙的に行われるのは望ましくありません。

82
qdii

はいといいえ。

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

  • C++ 98およびC++ 03はexplicit型変換演算子をサポートしていません
  • しかし、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では、明示的な変換演算子は、booleanに変換される場合、 "contextual conversion operator"と呼ばれます。 。また、暗黙的および明示的な変換について詳しく知りたい場合は、次のトピックをお読みください。

お役に立てば幸いです。

99
Nawaz