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