变量的常量及其生命周期

时间:2012-04-13 12:59:36

标签: c++

所以从另一个帖子中提到的a question,我想到了一个新问题,答案对我来说并不明显。

所以看来有一个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引用不会通过生命与传入的成员对象绑定。为什么不呢?

2 个答案:

答案 0 :(得分:10)

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

答案 1 :(得分:2)

我不确定我明白你在问什么。在你的代码中,唯一的 临时我看到的是初始化A("hey")的表达式中的bmain。然后将其复制(使用复制构造函数)到b.aB::B。在那之后,在任何地方都没有更多的临时工。

更一般地说,临时绑定到引用的事实 不一定会改变它的寿命。延长寿命的是 事实上,临时用于初始化引用:在你的 例如,temp中的f将永远不会对其产生影响 一个临时的生命周期,因为它没有用临时的初始化, 但另有参考。这条规则也有例外:如果 您使用临时初始化初始化程序中的成员引用 一个阶级,它的一生仍然不会超越结束 构造函数,所以:

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

无效。