const引用变量的生命周期未延长

时间:2015-11-27 06:01:43

标签: c++ reference lifetime string-literals

将临时绑定到const引用会延长其生命周期;比照GotW #88

为什么这不适用于此代码段?直播here

#include <iostream>
#include <string>

struct A {
    A() : s("abc") {}
    const std::string& s;
};

struct B {
    const std::string& s = "def";
};

int main() {
    A a;
    std::cout << a.s << std::endl;
    B b;
    std::cout << b.s << std::endl;
}

奖金问题:如何使用gcc触发警告?

4 个答案:

答案 0 :(得分:3)

在您链接的文章中,您会找到:

  

(注意这仅适用于基于堆栈的引用。它不适用于作为对象成员的引用。)

这就是ab中的引用无效的原因。他们不会延长临时生活。

答案 1 :(得分:3)

来自C ++ 14 [class.temporary] / 5:

  

绑定引用的临时对象或绑定引用的子对象的完整对象的临时对象仍然存在   对于参考的生命周期,除外:

     
      
  • 构造函数的 ctor-initializer 中与引用成员的临时绑定一直存在,直到构造函数退出。

  •   
  • [...]

  •   

答案 2 :(得分:1)

cppreference.com说:

  

临时绑定到构造函数初始值设定项中的引用成员   list只会持续存在,直到构造函数退出,而不是只有   对象存在。

http://en.cppreference.com/w/cpp/language/reference_initialization

答案 3 :(得分:0)

生命周期仅扩展到B的编译器生成器构造函数的末尾。当构造函数返回时,创建的临时字符串用于保存&#34; def&#34;将被销毁,留下你的悬挂参考。