为什么我在下面的代码中没有收到错误?

时间:2013-05-03 05:12:56

标签: c++ keyword

#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”的理解错误,请指出我。

1 个答案:

答案 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)

由于在最佳匹配方面没有一个得分,编译器会发出歧义诊断。