代码之家  ›  专栏  ›  技术社区  ›  Mihai Todor

Const引用为类成员

  •  11
  • Mihai Todor  · 技术社区  · 13 年前

    即使这个话题在这里被讨论了很多次,我也找不到关于我的具体案例的结论性解释。将 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 回复  |  直到 13 年前
        1
  •  12
  •   Jonathan Wakely    13 年前

    参考确实如此 延长使用寿命。该代码是合法的,但这只是因为您从未访问过 ref_m 在构造函数完成之后。

    临时绑定到构造函数参数, ref 稍后将另一个引用绑定到它, 参考_m ,不会延长使用寿命。如果是这样的话,堆栈上就会有一个对象,它必须与它绑定的引用成员一样长时间地保持,可以在堆上分配,因此当构造函数返回时,编译器将无法展开堆栈。

    如果能得到警告就好了,但编译器并不完美,有些事情很难得到警告。临时是在与绑定到引用的上下文不同的上下文中创建的,因此编译器只能判断是否存在启用内联或一些巧妙的静态分析的问题。

        2
  •  9
  •   Community Mohan Dere    9 年前

    这个 C++标准 状态:

    第二个上下文是当引用绑定到临时的时。这个 引用绑定到的临时或 将完整对象绑定到临时对象的子对象 在引用的生存期内持续存在,但以下指定的情况除外。 构造函数中引用成员的临时绑定 ctor初始值设定项(12.6.2)一直持续到构造函数退出。 A. 临时绑定到函数调用中的引用参数(5.2.2) 一直持续到包含 呼叫

    注释 :顺便说一句,这是重复的( 1 , 2 ),你应该搜索得更好,下次…:)