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


84

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

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

ここでは、例えば、私はキャストできるようにしたいと思いFooの中にstd::string、私は、このようなキャストは暗黙のうちに起こることを望んでいません。

回答:


101

はいといいえ。

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

お役に立てば幸いです。


9
C ++ 03でも、暗黙の変換を回避するのは簡単です。toStringではなく、関数を呼び出すだけですoperator std::string。もちろん、これにより一部のテンプレートで問題が発生する可能性があります。私はいつも使っtoStringていて、問題が発生することはありませんが、これはコーディングスタイルに依存する可能性があると思います。
James Kanze 2011年

@MatthieuM。ちょうどoperator std::string():-)のように。
James Kanze 2011年

2
to_string代わりに使用します。これは、C ++ 11がそれを呼んでいるものであるため、上位互換コードの記述テンプレートの作成に役立ちます。
ルイスマチュカ2012

1
std::string s(a)またはstd::string s{a}としても機能する必要がありstatic_cast<std::string>(a)ます。
alfC 2013

2
@Bin:を記述したときに、コンパイラによってコンテキストによってexplicit operator bool() 呼び出されるためです。ここで発生する変換は、暗黙の変換ではなく、(非公式に)コンテキスト変換と呼ばれることに注意してください。if(std::cin)
nawaz 2015
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.