演员可以明确吗?

当涉及到构造函数时,添加关键字explicit防止热心的编译器在不是程序员的第一意图时创build对象。 这样的机制是否也适用于铸造操作员?

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

在这里,例如,我希望能够将Foo投射到一个std::string ,但是我不希望这样的投射隐式发生。

是和不

这取决于你正在使用的C ++版本。

  • C ++ 98和C ++ 03不支持explicittypes转换运算符
  • 但是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'转换为非标量types'std :: string'请求

在线演示: http : //ideone.com/DJut1

但是,只要你写:

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

错误消失: http : //ideone.com/LhuFd

顺便说一下,在C ++ 11中,显式转换运算如果转换为布尔值,则称为“上下文转换运算符” 。 此外,如果您想了解更多关于隐式和显式转换的信息,请阅读以下主题:

  • 隐式VS显式转换

希望有所帮助。