为什么我在下面的代码中没有出错?

问题描述:

#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”的理解有误。为什么我在下面的代码中没有出错?

+0

了解明确的关键字的用法如下: http://stackoverflow.com/questions/121162/what-does-the-explicit-keyword-in-c-mean – 2013-05-03 05:45:31

+0

@AayushiJain的评论谢谢,但我已经阅读了这篇文章。 – 2013-05-03 05:56:59

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.6A类型的反对这创造了一个模糊性:

A::A(int a) 

A::A(float d) 

由于在最佳匹配方面没有其他方面得分,所以co mpiler发出歧义的诊断。

+0

但我如何得到主函数中第二行的编译时错误。 – 2013-05-03 05:18:09

+0

@Apoorvasahay通过清除明确,你可以得到编译时错误 – 2013-05-03 05:19:31

+0

@ ling.s然后什么是显式关键字的使用。据我所知,明确的关键字应该用于禁用隐式转换。我的目标不是让这些代码可编译,而是要了解显式关键字的用法。 – 2013-05-03 05:23:03