强制转换操作符可以是显式的吗?

Can a cast operator be explicit?

本文关键字:转换 操作符      更新时间:2023-10-16

当涉及到构造函数时,添加关键字explicit可以防止热心的编译器创建一个不是程序员最初意图的对象。这种机制也适用于铸造操作符吗?

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

在这里,例如,我希望能够将Foo强制转换为std::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:错误:请求从'A'转换为非标量类型'std::string'

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

但是一旦你写:

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

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

顺便说一下,在c++ 11中,如果显式转换操作符转换为布尔值,则将其称为"上下文转换操作符"。此外,如果您想了解更多关于隐式和显式转换的信息,请阅读此主题:
  • 隐式与显式转换