1. ホーム
  2. c++

[解決済み] キャスト演算子を明示的に使用することはできますか?

2023-04-28 16:51:05

質問

コンストラクタに関して、キーワード explicit を追加することで、熱心なコンパイラがプログラマの最初の意図とは異なるオブジェクトを作成することを防ぎます。そのようなメカニズムは、キャスト演算子にも利用可能ですか?

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

ここでは、例えば、キャストするために Foostd::string に変換することができますが、このようなキャストは暗黙のうちに行われないようにしたいものです。

どのように解決するのですか?

はい、いいえ。

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: error: 'A' から非スカラー型 'std::string' への変換が要求されました。

オンラインデモ: http://ideone.com/DJut1

でも、書いたとたんに

std::string s = static_cast<std::string>(a); //ok - explicit conversion 

エラーが消える : http://ideone.com/LhuFd

ちなみに、C++11 では、明示的な変換演算子は contextual conversion operator" と呼ばれています。 と呼ばれ、もしそれが ブール型 . また、暗黙的および明示的な変換についてもっと知りたい場合は、このトピックを読んでください。

お役に立てれば幸いです。