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

4

1 回答 1

4
explicit A(float d);

你不认为它有。它禁用从float到 type的隐式转换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)用于创建A传递给方法的类型的对象Test()


为什么如果你删除它不编译explicit

如果没有关键字explicit,则转换构造函数可用于转换,这会产生歧义,因为在转换为 type 的对象A::A(float d)时有两种可能的匹配项: 12.6A

A::A(int a)

或者

A::A(float d)

由于没有人在最佳匹配方面得分高于其他人,因此编译器会发出歧义诊断。

于 2013-05-03T05:15:50.330 回答