4

それで、別のスレッドで尋ねられた質問から、私は新しい質問を考えました、そして、答えは私には明白ではありません。

したがって、一時的なものへのconst参照がある場合、一時的なものの存続期間は少なくともconst参照と同じ長さであるというc++ルールがあるようです。しかし、別のオブジェクトのメンバー変数へのローカルconst参照があり、スコープを離れる場合はどうなりますか?それはその変数のデストラクタを呼び出しますか?

だからここに元の質問から変更されたプログラムがあります:

#include <iostream>
#include <string>
using namespace std;

class A {
public:
   A(std::string l) { k = l; };
   std::string get() const { return k; };
   std::string k;
};

class B {
public:
   B(A a) : a(a) {}
   void b() { cout << a.get(); }  //Has a member function
   A a;
};

void f(const A& a)
{  //Gets a reference to the member function creates  a const reference
     stores it and goes out of scope
 const A& temp = a;
 cout << "Within f(): " << temp.k << "\n";
}

int main() {
   B b(A("hey"));

   cout << "Before f(): " << b.a<< "\n";

   f(b.a);

   cout << "After f(): " << b.a.k << "\n";

   return 0;
}

したがって、このコードを実行すると、毎回値として「hey」が返されます。これは、ローカルconst参照が、渡されたメンバーオブジェクトとのライフを通じてそれ自体をバインドしないことを意味しているようです。なんでそうじゃないの?

4

2 に答える 2

10

b.aは一時的なものではないため、その後にバインドされる参照によってその存続期間が影響を受けることはありません。

于 2012-04-13T13:08:25.800 に答える
2

あなたが何を求めているのかよくわかりません。あなたのコードでは、私が目にする唯一の一時的なものは、A("hey")で初期化する式のb ですmain。そして、それは (コピー コンストラクターを使用して) b.a in にコピーされB::Bます。その後、一時的なものはどこにもありません。

より一般的には、テンポラリーが参照にバインドされているという事実は、必ずしもその有効期間を変更しません。寿命を延ばすのは、参照を初期化するために一時が使用されるという事実です。たとえば、あなたの場合、tempinfは一時ではなく別の参照で初期化されるため、一時の寿命に影響を与えることはありません. また、この規則には例外があります。一時を使用してクラスの初期化子でメンバー参照を初期化する場合、その有効期間はコンストラクターの終わりを超えて延長されないため、次のようになります。

class A
{
    std::string const& rString;
public:
    A() : rString( std::string( "hey" ) ) {}
    std::string get() const { retur rString; }
};

動作しないでしょう。

于 2012-04-13T14:39:45.793 に答える