0

構造体型を受け取る完全に適切なコンストラクターがあるにもかかわらず、コンパイラーが構造体のキャストを選択するという奇妙な状況に遭遇しました。
小さな例:

struct A
{
    operator int() {return 1;}
};

struct B
{
    B(A& a) { OutputDebugStringA("A constructor\n"); }
    B(int i) { OutputDebugStringA("int constructor\n"); }
};
A test () { A a; return a;};

int _tmain(int argc, _TCHAR* argv[])
{
    B b(test());
   return 0;
}

説明: Aには int へのキャスト演算子があります。Bには2 つのオーバーロードされたコンストラクターがあり、1 つはA 参照を受け入れ、もう 1 つはintを受け入れます。
関数test()は A オブジェクトを返します。

何らかの理由で、コンパイラは戻り値を int にキャストし、int を受け入れるコンストラクターを使用することを決定します。int constructor

なぜこれが起こるのか誰でも説明できますか?いくつかの理論がありますが、実際の何かに基づいた答えが欲しいです(おそらく標準からの引用)。

注:
コンストラクターのシグネチャを次のように変更することで、期待される結果 (型を受け入れるコンストラクター) を取得できます B(const A& a)B(A&& a)

4

1 に答える 1

5

コンストラクターはA、一時的にバインドできない への非 const 参照を取ります。ここで一時的に渡します:

 B b(test());
 //  ^^^^^^ temporary A

したがって、唯一の有効なコンストラクターは、int. const関連するコンストラクターが参照を取るようにすることで、この動作を変更できます。

B(const A& a) { OutputDebugStringA("A constructor\n"); }
//^^^^^

B(A&& a);C++11の場合も同様です。

または、元のコンストラクターの署名を保持し、左辺値を渡すと、コンストラクター呼び出しも発生します。

A a;
B b(a);
于 2013-07-24T19:28:42.103 に答える