4

因此,从另一个线程中提出的问题中,我想到了一个新问题,答案对我来说并不明显。

因此,似乎有一条 c++ 规则规定,如果您对临时对象有 const 引用,那么临时对象的生命周期至少与 const 引用一样长。但是,如果你有一个对另一个对象的成员变量的本地 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;
}

所以当我运行这段代码时,我每次都会得到“嘿”作为值。这似乎意味着本地 const 引用不会通过传入的成员对象将自己绑定到一生中。为什么不呢?

4

2 回答 2

10

b.a不是临时的,因此它的生命周期不受随后绑定到它的任何引用的影响。

于 2012-04-13T13:08:25.800 回答
2

我不确定我明白你在问什么。在您的代码中,我看到的唯一临时变量是A("hey")在初始化的表达式bmain。这被复制(使用复制构造函数)到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 回答