1

次のコードでは、この行に

A(A&b)

このコンパイラを使用すると、次のようなエラーが発生します

c110.cpp:41: エラー: 'A::A(A)' の呼び出しに一致する関数がありません</p>

c110.cpp:8: 注: 候補は: A::A(A&)

しかし、私はそれをに変換するとすぐに

A(const A&b)

事前に多くの多くの感謝

エラーは出ません。なぜそうなのですか?

Code
class A
{
    public: 
    static int cnt;
    A(A& b)
    {
       cnt++;
       cout<<"cnt="<<cnt<<endl;
    }
    A()
    {
       cnt++;
       cout<<"cnt="<<cnt<<endl;
    }
    ~A()
    {
       cnt--;
       cout<<"cnt="<<cnt<<endl;
    }
};



  int A :: cnt=0;


  A fun(A b)
  {
  return b;
  }


 int main()
 {
     A a;
     A b=fun(a);
     return 0;
 }
4

2 に答える 2

10

const参照は一時的にバインドできません。パラメーターとして一時的なものを渡すと、A&違法ですが、const A&そうではありません。

この線

A b=fun(a);

によって返されたオブジェクトに対してコピー初期化を行いますがfun(a)、これは一時的なものです。

また、論理的には、コピー元のオブジェクトを変更する必要がないため、コピー コンストラクターは非 const 参照を取るべきではありません。

于 2012-07-04T11:09:18.787 に答える
0

コンパイラに依存してRVOが実行されるかどうかに関係なく、A(A&)ではなくA(const A&)タイプの構文をコピー構築に使用するのが常に安全だと思います。

上記の質問のように、RVOは実行されておらず、一時的なものが作成されているため、A(const A&)は安全に使用できます。

于 2012-07-04T11:31:47.080 に答える