演员可以明确吗?

时间:2011-11-23 08:51:57

标签: c++ casting operator-keyword explicit

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

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

例如,在这里,我希望能够将Foo转换为std::string,但我不希望隐式发生此类转换。

1 个答案:

答案 0 :(得分:98)

是和否。

这取决于您正在使用的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

BTW,在C ++ 11中,显式转换运算符如果转换为 boolean ,则称为“上下文转换运算符”。另外,如果您想了解有关隐式和显式转换的更多信息,请阅读以下主题:

希望有所帮助。