强制转换运算符可以是显式的吗?


84

对于构造函数,添加关键字explicit可以防止热心的编译器在不是程序员的初衷时创建对象。这样的机制也可用于铸造操作员吗?

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

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

Answers:


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中,如果显式转换运算转换为boolean,则称为“上下文转换运算符”。另外,如果您想进一步了解隐式和显式转换,请阅读以下主题:

希望能有所帮助。


9
即使在C ++ 03中,也很容易避免隐式转换。只是调用函数toString,而不是operator std::string。当然,这可能会导致某些模板出现问题。我一直使用toString,它从来没有给我带来任何问题,但是我认为这可能取决于您的编码风格。
James Kanze 2011年

@MatthieuM。就像operator std::string():-)。
James Kanze 2011年

2
to_string改用。它有助于C ++ 11调用它,因此它有助于编写与向前兼容的代码并有助于模板。
路易斯·马丘卡

1
std::string s(a)std::string s{a}还应该作为static_cast<std::string>(a)
alfC

2
@Bin:因为在编写时编译器会根据上下文explicit operator bool() 调用。请注意,此处发生的转换(非正式地)称为上下文转换,而不是隐式转换。if(std::cin)
Nawaz 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.