Const引用作为类成员

时间:2013-03-20 01:33:39

标签: c++ class reference const member

即使在这里多次讨论过这个问题,我也无法找到关于我的具体案例的确凿解释。 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;
}

2 个答案:

答案 0 :(得分:7)

引用延长生命周期。代码是合法的,但仅仅是因为在构造函数完成后你永远不会访问ref_m

临时绑定到构造函数参数ref。稍后将另一个引用绑定到ref_m,不会延长生命周期。如果确实如此,那么你在堆栈上有一个对象,只要它绑定的引用成员必须持久化,它可以在堆上分配,因此编译器将无法解除构造函数返回时堆栈。

获得警告会很好,但编译器并不完美,有些事情很难被警告。临时文件是在它与引用绑定的不同上下文中创建的,因此编译器只能告诉启用打开的问题或者一些聪明的静态分析。

答案 1 :(得分:5)

C ++标准声明:

  

第二个上下文是引用绑定到临时的。该   临时引用的临时或临时的   完成对象到临时绑定的子对象   除以下规定外,在参考文件的生命周期内仍然存在。   临时绑定到构造函数中的引用成员   ctor-initializer(12.6.2)一直存在,直到构造函数退出。 A.   临时绑定到函数调用中的引用参数(5.2.2)   一直持续到包含完整表达式的完成   调用

注意:顺便说一下,这是重复的(12),您应该更好地搜索,下次......:)