当涉及构造函数时,添加关键字explicit
会阻止热心的编译器在不是程序员的第一个意图时创建对象。这种机制是否也适用于铸造操作员?
struct Foo
{
operator std::string() const;
};
例如,在这里,我希望能够将Foo
转换为std::string
,但我不希望隐式发生此类转换。
答案 0 :(得分:98)
是和否。
这取决于您正在使用的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'请求
但是一旦你写道:
std::string s = static_cast<std::string>(a); //ok - explicit conversion
BTW,在C ++ 11中,显式转换运算符如果转换为 boolean ,则称为“上下文转换运算符”。另外,如果您想了解有关隐式和显式转换的更多信息,请阅读以下主题:
希望有所帮助。