3

次のコードで「オーバーロードされた関数への未定義の呼び出し」エラーが表示されないのはなぜですか? int が組み込み型だからですか?以下のコードのように、標準のどこで組み込み型への変換の保証を見つけることができますか?...ありがとう!

#include <iostream>
using namespace std;

class B {
public:
operator int(){ return 0; }
};

class A {
public:
A( int i ) { };
};

void f ( int i ) { cout << "overload f(int) was used!";};
void f ( A a )   { cout << "overload f(A) was used!" ;};


int main () {
  B b;
  f( b );
}
4

1 に答える 1

7

ビルトインタイプとは関係ありません。に対して定義operator intしましたBBこれは、からへのユーザー定義の変換を提供したことを意味しますint。標準の12.3.4によると、「最大で1つのユーザー定義の変換(コンストラクターまたは変換関数)が1つの値に暗黙的に適用されます」。これが、に変換されない理由です。これにはA、2つの暗黙的な変換が必要になるためです。

これがいつ発生するかを正確に判断するためのルールはやや複雑であるため、多くの人は、ユーザー定義の変換を提供しないようにアドバイスしています。これらを定義する別の方法は、コンストラクターに1つの引数を提供することです。explicit暗黙的に適用されないように、先頭に追加できます。

を呼び出すf(b)と、コンパイラは、に変換するために提供した変換を適用しbますint。に変換する場合は、からへAの変換を定義するか、またはのように変換の1つを明示的に適用する必要があります。BAf(int(b))f(A(b))

于 2012-10-09T12:22:50.443 に答える