#include <iostream>
using namespace std;
class A
{
private:
float data_member;
public:
A(int a);
explicit A(float d);
};
A::A(int a)
{
data_member = a;
}
A::A(float d)
{
data_member = d;
}
void Test(A a)
{
cout<<"Do nothing"<<endl;
}
int main()
{
Test(12);
Test(12.6); //Expecting a compile time error here
return 0;
}
我期待在这种情况下出错,因为我的CTOR采用浮点值是显式的。但是我在VS 2010中没有收到任何错误。如果我对c ++中关键词“EXPLICIT”的理解错误,请指出我。
答案 0 :(得分:4)
explicit A(float d);
你认为它不是吗?它会禁用从float
到类型A
的隐式转换。简而言之,它禁用任何隐式转换,其中float将隐式转换为A
的对象。例如:
void doSomething(A obj){}
doSomething(2.3);
它不会禁用标准允许的任何隐式转换。
为什么要编译?
Test(12.6);
因为float
参数隐式转换为int
。幕后发生的事情与:
float a = 12.6;
int b = (int)a;
此外,转换构造函数A::A(int a)
用于创建类型为A
的对象,该对象将传递给方法Test()
。
如果删除
,为什么不编译explicit
?
如果没有关键字explicit
,转换构造函数A::A(float d)
可用于转化,这会产生歧义,因为在将12.6
转换为{{1}类型的对象时,有两种可能的匹配}:
A
或
A::A(int a)
由于在最佳匹配方面没有一个得分,编译器会发出歧义诊断。