我遇到了一个奇怪的情况,编译器选择构建一个结构,即使有一个非常好的构造函数接收结构类型。
一个小例子:
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 重载的构造函数,一个接受一个引用,另一个接受 int 。
函数 test()返回一个A对象。
由于某种原因,编译器决定将返回值强制转换为int,并使用接受int的构造函数。 int constructor
任何人都能解释为什么会这样吗?我有一些理论,但我想要一个基于真实事物的答案(可能是标准的引用)。
注意:
我可以通过将构造函数签名更改为:B(const A& a)
或B(A&& a)
答案 0 :(得分:5)
您的构造函数对A
采用非const引用,该引用无法绑定到临时值。你在这里暂时传递它:
B b(test());
// ^^^^^^ temporary A
所以唯一有效的构造函数是int
。您可以通过使相关构造函数采用const
引用来更改此行为:
B(const A& a) { OutputDebugStringA("A constructor\n"); }
//^^^^^
,类似于C ++ 11中的B(A&& a);
。
或者,保持原始构造函数签名并传递左值也会导致构造函数调用:
A a;
B b(a);