class Test {
private:
int value;
public:
void display(void)
{
cout << "Value [" << value << "]" << endl;
}
explicit Test(int i)
{
value=i;
}
};
int main() {
Test a(5);
Test b(4.9);
a.display();
b.display();
cin.get();
return 0;
}
即使提到了显式,浮点值也会转换为int。
我期待(错误地)浮点数不会转换为整数而对象b不会被构造。
答案 0 :(得分:7)
explicit
不会阻止构造函数参数的隐式转换。这意味着构造函数本身可能不会被用作对类类型Test
的隐式转换。
void func( Test ); // function declaration
func( 5 ); // Your "explicit" makes this call an error.
要防止构造函数(或任何函数)的参数隐式转换,您可以使用C ++ 11 = delete
语法。
Test(int i)
{
value=i;
}
template<typename T>
Test(const T&) = delete;
// ^ Aside from your int constructor and the implicitly-generated
// copy constructor, this will be a better match for any other type
答案 1 :(得分:3)
explicit
只是阻止任何隐式转换。所以如果你有:
void foo(Test t);
您无法致电foo(4);
,因为Test
构造函数为explicit
。你必须致电foo(Test(4));
。 explicit
关键字与构建期间可能发生的任何转化无关。
来自标准[class.conv.ctor]:
显式构造函数构造对象就像非显式构造函数一样,但是仅 直接初始化语法(8.5)或强制转换(5.2.9,5.4)显式使用。
这意味着Test t = 4;
也是非法的,但Test t(42.0)
没问题。