使用以下代码:
class B{};
class A{
public:
A(B& b);
A(const A& a);
};
A::A(B& b){
}
A::A(A& a){
}
int main(){
B b;
A a = b;
}
没有对“A::A(A)”的匹配函数调用
我查阅了一些参考资料,认为这可能是由返回值优化 (RVO) 引起的,所以我尝试通过 -fno-elide-constructor 选项禁用优化。问题依然存在。
使用以下代码:
class B{};
class A{
public:
A(B& b);
A(const A& a);
};
A::A(B& b){
}
A::A(A& a){
}
int main(){
B b;
A a = b;
}
没有对“A::A(A)”的匹配函数调用
我查阅了一些参考资料,认为这可能是由返回值优化 (RVO) 引起的,所以我尝试通过 -fno-elide-constructor 选项禁用优化。问题依然存在。
A a = b;
在上面的代码中,从语义上讲A
,创建了一个类型为1的临时对象,该对象将被传递给 的复制构造函数A
,但是正如您定义的复制构造函数一样,它通过非常量引用获取参数,但是临时对象不能绑定到非常量引用,因此会出现错误。
所以你需要做的就是添加 const
定义::
A::A(A const &a) //const added
{
}
现在你的代码应该可以编译了。
1. 请注意,我在语义A
上说正在创建一个临时类型的对象。编译器可能会优化这一步(事实上,任何像样的编译器都会优化这一步)并且可能会实际创建临时对象,并且可能实际调用复制构造函数。但即使它实际上没有被调用,您也需要可访问的复制构造函数仅用于语义检查。