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;
}

この場合、float 値を取る CTOR が明示的であるため、エラーが発生することが予想されます。しかし、VS 2010 ではエラーが発生しません。C++ のキーワード「EXPLICIT」の理解が間違っている場合は、指摘してください。

4

1 に答える 1

4
explicit A(float d);

そうは思いませんか。floatからtype への暗黙的な変換を無効にします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)タイプのオブジェクトを作成します。ATest()


を削除するとコンパイルされないのはなぜexplicitですか?

キーワードがないとexplicit、変換コンストラクターを変換に使用できますが、 type のオブジェクトA::A(float d)に変換するときに 2 つの可能な一致があるため、あいまいさが生じます。 12.6A

A::A(int a)

また

A::A(float d)

ベスト マッチの点で他に勝るスコアがないため、コンパイラはあいまいさの診断を発行します。

于 2013-05-03T05:15:50.330 に答える