2011-11-23 12 views
77

コンストラクタに関しては、キーワードexplicitを追加すると、熱心なコンパイラがプログラマの最初の意図ではないときにオブジェクトを作成できなくなります。このような仕組みは鋳造作業者にとっても利用可能ですか?ここでキャスト演算子を明示的に使用できますか?

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

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

答えて

94

はいといいえ

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

  • C++ 98とC++ 03 explicit型変換演算子
  • をサポートしていませんが、C++ 11ありません。

    prog.cpp:13:20: error: conversion from 'A' to non-scalar type 'std::string' requested

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

    しかし、すぐにあなたが書いている:

例、

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でそれをコンパイルし

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

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

をBTW、C++ 11に、明示的な変換演算子は、それがブールに変換する場合「コンテキスト変換演算子」と呼ばれています。また、あなたがこのトピックを読んで、暗黙的および明示的な変換についての詳細をお知りになりたい場合は:

お役に立てば幸いです。

+1

+1。 C++ 11コードの例を載せてください。 – FailedDev

+1

@FailedDev:完了。 :-) – Nawaz

+1

非常に良いおかげで! – FailedDev