未扩展常量引用变量的生存期

Lifetime of const reference variable not extended

本文关键字:生存期 变量 引用 扩展 常量      更新时间:2023-10-16

将临时引用绑定到常量引用可以延长其生存期;参见GotW#88。

为什么这对这个片段不起作用?住在这里。

#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触发警告?

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

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

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

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

引用绑定到的临时对象或作为引用绑定到子对象的完整对象的临时对象仍然存在参考的使用寿命,除外:

  • 构造函数的ctor初始值设定项中到引用成员的临时绑定将持续存在,直到构造函数退出。

  • […]

cppreference.com说:

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

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

生存期仅扩展到B的编译器生成器构造函数的末尾。当构造函数返回时,为保存"def"而创建的临时字符串将被销毁,留下一个悬空引用。