10

この辺りで何度も議論されたとしても、私の特定のケースについての決定的な説明は見つかりません。一時的なconstものの寿命を延ばしますか?RefTest以下の例は合法ですか?

#include <iostream>

class RefTest
{
public:
    RefTest(const std::string &input) : str(input) {}
    ~RefTest () {std::cout << "RefTest" << std::endl;}
private:
    std::string str;
};

class Child
{
public:
    Child (const RefTest &ref) : ref_m(ref) {}
    ~Child () {std::cout << "Test" << std::endl;}
private:
    const RefTest &ref_m;
};

class Test
{
public:
    Test () : child(RefTest("child")) {}//Will the temporary get destroyed here?
    ~Test () {std::cout << "Test" << std::endl;}
private:
    const Child child;
};

int main ()
{
   Test test;
}
4

2 に答える 2

10

参照は寿命を延ばしません。コードは合法ですがref_m、コンストラクターの終了後にアクセスすることがないためです。

一時はコンストラクターパラメーターにバインドされますref。後で別の参照をバインドしてref_mも、有効期間は延長されません。もしそうなら、スタック上にオブジェクトがあり、それがバインドされている参照メンバーである限り存続する必要があり、ヒープに割り当てることができるため、コンストラクターが戻ったときにコンパイラーはスタックを巻き戻すことができません。

警告が表示されると便利ですが、コンパイラは完全ではなく、警告が難しいものもあります。一時は、参照にバインドされている場所とは異なるコンテキストで作成されるため、コンパイラーは、インリングがオンになっているか、いくつかの巧妙な静的分析に問題があることしかわかりません。

于 2013-03-20T02:02:44.483 に答える
9

C++標準は次のように述べています。

2番目のコンテキストは、参照が一時的なものにバインドされている場合です。参照がバインドされている一時オブジェクト、または一時がバインドされているサブオブジェクトの完全なオブジェクトである一時オブジェクトは、以下に指定されている場合を除き、参照の存続期間中存続します。 コンストラクターのctor-initializer(12.6.2)の参照メンバーへの一時的なバインドは、コンストラクターが終了するまで持続します。関数呼び出し(5.2.2)の参照パラメーターへの一時的なバインドは、呼び出しを含む完全な式が完了するまで持続します。

:ちなみに、これは重複しています(1、2 ) 。次回はもっとよく検索する必要があります... :)

于 2013-03-20T02:05:51.287 に答える