77
当涉及到构造函数时,添加关键字explicit
可防止热心编译器在不是程序员的第一意图时创建对象。这种机制是否也适用于铸造操作员?演员可以明确吗?
struct Foo
{
operator std::string() const;
};
这里,比如,我想是能够施展Foo
为std::string
,但我不希望这样的投含蓄发生。
当涉及到构造函数时,添加关键字explicit
可防止热心编译器在不是程序员的第一意图时创建对象。这种机制是否也适用于铸造操作员?演员可以明确吗?
struct Foo
{
operator std::string() const;
};
这里,比如,我想是能够施展Foo
为std::string
,但我不希望这样的投含蓄发生。
是和否
这取决于您正在使用的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: error: conversion from 'A' to non-scalar type 'std::string' requested
但只要你写:
std::string s = static_cast<std::string>(a); //ok - explicit conversion
顺便说一句,在C++ 11中,显式转换操作被称为“上下文相关的转换运算符”如果将其转换为布尔。另外,如果你想知道更多关于隐性和显性的转换,阅读本主题:
希望有所帮助。
+1。可以发布一个C++ 11代码的例子吗? – FailedDev
@FailedDev:完成。 :-) – Nawaz
非常感谢! – FailedDev