为什么我在下面的代码中没有出错?
#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;
}
我期待错误int这种情况下,因为我的CTOR采取浮动值是显式的。但是我在VS 2010中没有收到任何错误。请指出我是否对我对C++中关键字“EXPLICIT”的理解有误。为什么我在下面的代码中没有出错?
explicit A(float d);
您是否认为它确实如此。它禁用从float
到类型A
的隐式转换。简而言之,它会禁用任何隐式转换,其中浮点将被隐式转换为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)
用于创建其被传递给该方法Test()
A
类型的对象:作为发生什么幕后是一样的。
为什么,如果你删除
explicit
它不能编译?
没有关键字explicit
转换构造A::A(float d)
可用于转化和因为有两个可能的匹配,转换12.6
当A
类型的反对这创造了一个模糊性:
A::A(int a)
或
A::A(float d)
由于在最佳匹配方面没有其他方面得分,所以co mpiler发出歧义的诊断。
但我如何得到主函数中第二行的编译时错误。 – 2013-05-03 05:18:09
@Apoorvasahay通过清除明确,你可以得到编译时错误 – 2013-05-03 05:19:31
@ ling.s然后什么是显式关键字的使用。据我所知,明确的关键字应该用于禁用隐式转换。我的目标不是让这些代码可编译,而是要了解显式关键字的用法。 – 2013-05-03 05:23:03
了解明确的关键字的用法如下: http://stackoverflow.com/questions/121162/what-does-the-explicit-keyword-in-c-mean – 2013-05-03 05:45:31
@AayushiJain的评论谢谢,但我已经阅读了这篇文章。 – 2013-05-03 05:56:59