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;

上記のコードでは、意味的にはタイプ1の一時オブジェクトがA作成され、これは のコピー コンストラクターに渡されますが、コピー コンストラクターを定義たので、非 const 参照によって引数を取りますが、一時オブジェクトを非 const 参照にバインドできないため、エラーが発生します。A

したがって、あなたがする必要があるのは、定義にも追加することです:: const

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

これで、コードがコンパイルされるはずです。

1.タイプの一時オブジェクトが作成されることを意味的に述べたことに注意してください。Aコンパイラはこのステップを最適化する可能性があり (実際、適切なコンパイラはこのステップを最適化します)、一時オブジェクトが実際に作成され、コピー コンストラクタが実際に呼び出される可能性があります。ただし、実際に呼び出されていない場合でも、セマンティック チェックのみにアクセス可能なコピー コンストラクターが必要です。

于 2012-05-01T02:34:48.143 に答える