0

使用以下代码:

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 选项禁用优化。问题依然存在。

4

1 回答 1

1
A a = b;

在上面的代码中,从语义上讲A,创建了一个类型为1的临时对象,该对象将被传递给 的复制构造函数A,但是正如您定义的复制构造函数一样,它通过非常量引用获取参数,但是临时对象不能绑定到非常量引用,因此会出现错误。

所以你需要做的就是添加 const定义::

A::A(A const &a)   //const added
{
} 

现在你的代码应该可以编译了。

1. 请注意,我在语义A上说正在创建一个临时类型的对象。编译器可能会优化这一步(事实上,任何像样的编译器都会优化这一步)并且可能会实际创建临时对象,并且可能实际调用复制构造函数。但即使它实际上没有被调用,您也需要可访问的复制构造函数仅用于语义检查。

于 2012-05-01T02:34:48.143 回答