对于构造函数,添加关键字explicit
可以防止热心的编译器在不是程序员的初衷时创建对象。这样的机制也可用于铸造操作员吗?
struct Foo
{
operator std::string() const;
};
例如,在这里,我希望能够Foo
转换为std::string
,但是我不希望这种转换隐式发生。
Answers:
是和否
这取决于您使用的C ++版本。
explicit
类型转换运算符例,
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,则称为“上下文转换运算符”。另外,如果您想进一步了解隐式和显式转换,请阅读以下主题:
希望能有所帮助。
operator std::string()
:-)。
to_string
改用。它有助于C ++ 11调用它,因此它有助于编写与向前兼容的代码,并有助于模板。
std::string s(a)
或std::string s{a}
还应该作为static_cast<std::string>(a)
。
explicit operator bool()
调用。请注意,此处发生的转换(非正式地)称为上下文转换,而不是隐式转换。if(std::cin)
toString
,而不是operator std::string
。当然,这可能会导致某些模板出现问题。我一直使用toString
,它从来没有给我带来任何问题,但是我认为这可能取决于您的编码风格。