这段代码
#include <iostream>
struct A
{
A(int i) {std::cout << "int received\n";}
A(A& a) {std::cout << "ref received\n";}
};
int main()
{
int j = 5;
A a = j;
}
意外引发以下编译器错误:
error: invalid initialization of non-const reference of type 'A&' from an rvalue of type 'A'
note: initializing argument 1 of 'A::A(A&)'
note: after user-defined conversion: A::A(int)
当我删除第二个构造函数重载A(A& a)
时,一切都按预期工作。我想编译器错误地调用了第二个构造函数而不是第一个。
为什么会这样?
我怎样才能让一个具有引用构造函数和右值构造函数的类和谐地工作?
我使用 GNU GCC。
注意:我还注意到一些奇怪的事情:显然,如果我用 替换该行A a = j;
,A a(j);
一切都会按预期工作。void f(A a)
然而,这并不令人满意,因为如果我试图从函数参数初始化对象(例如:调用with f(j)
),它仍然不起作用。