演员可以明确吗?
当涉及到构造函数时,添加关键字explicit
防止热心的编译器在不是程序员的第一意图时创build对象。 这样的机制是否也适用于铸造操作员?
struct Foo { operator std::string() const; };
在这里,例如,我希望能够将Foo
投射到一个std::string
,但是我不希望这样的投射隐式发生。
是和不
这取决于你正在使用的C ++版本。
- C ++ 98和C ++ 03不支持
explicit
types转换运算符 - 但是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'转换为非标量types'std :: string'请求
在线演示: http : //ideone.com/DJut1
但是,只要你写:
std::string s = static_cast<std::string>(a); //ok - explicit conversion
错误消失: http : //ideone.com/LhuFd
顺便说一下,在C ++ 11中,显式转换运算符如果转换为布尔值,则称为“上下文转换运算符” 。 此外,如果您想了解更多关于隐式和显式转换的信息,请阅读以下主题:
- 隐式VS显式转换
希望有所帮助。