9

私が持っていると仮定します:

  • コピー不可のクラスA
  • メンバーとして const A& a を持つクラス B (コンストラクターで A を受け取り、初期化リストに設定します)
  • 機能A GenerateA();

これは、 B(GenerateA()) を行うことが有効であることを意味しますか?

つまり、const ref は、generateA() が返す A のコピーが行われないことを意味しますか? そして、返されたテンポラリのスコープは、B が存在する限り拡張されるということですか?

編集: コメントからのアドオンの質問: lvalue が const A& の場合、A& を GenerateA() からローカル A に返すことは許容されますか?

ありがとう!

4

4 に答える 4

4

がコピーできない場合、値で返すにはコピーを作成する必要があるためA、関数は無効です。A GenerateA()

関数が代わりに参照を返し (つまりA &GenerateA())、参照がローカルに作成されたAオブジェクトへの参照である場合、関数が終了するとすぐに無効になります。C++ にはガベージ コレクションの形式がないため、使用中のオブジェクトの有効期間を「延長」する方法はありません。

于 2010-11-10T04:54:20.470 に答える
3

他の人がすでに述べているように、コピー可能でA GenerateA()なければコンパイルできません。A

const ref : no に関して、一時オブジェクトの有効期間は B の有効期間まで延長されません。標準 [12.2.5] には次のように記載されています。

コンストラクターの ctor-initializer (12.6.2) の参照メンバーへの一時的なバインドは、コンストラクターが終了するまで持続します。[...] 関数 return ステートメント (6.6.3) の戻り値への一時的なバインドは、関数が終了するまで持続します。

はい、一時的な有効期間の延長は、いくつかのコンテキストで存在します (そして、時には本当に便利です:この記事を参照してください) が、提示されたものではありません。

最後の質問に関しては、ローカル変数への参照を返すことは合法ではありませんGenerateA()(結果を const 参照にバインドしても何の役にも立ちません)。

于 2010-11-10T07:24:01.800 に答える
0

はいといいえ。

はい、const参照は一時変数にバインドされます。いいえ、クラスメンバーであるconst参照は、自動期間のconst参照のように存続期間を延長しません。

于 2010-11-10T04:51:21.283 に答える
0

例を次に示します。

#include <iostream>
using namespace std;

int& GenX(bool reset)
{
    static int* x = new int;
    *x = 100;
    if (reset)
    {
        delete x;
        x = new int;
        *x = 200;
    }
    return *x;
}

class YStore
{
public:
    YStore(int& x);
    int& getX() { return my_x; }
private:
    int& my_x;
};

YStore::YStore(int& x)
 : my_x(x)
{
}

int main()
{
    YStore Y(GenX(false));
    cout << "X: " << Y.getX() << endl;
    GenX(true); // side-effect in Y
    cout << "X: " << Y.getX() << endl;
    return 0;
}

出力:

X: 100
X: 200
于 2010-11-10T05:03:27.183 に答える