未扩展常量引用变量的生存期
Lifetime of const reference variable not extended
将临时引用绑定到常量引用可以延长其生存期;参见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触发警告?
在您链接到的文章中,您会发现:
(请注意,这只适用于基于堆栈的引用。它不适用于作为对象成员的引用。)
这就是a
和b
中的引用无效的原因。他们不会延长临时工的寿命。
来自C++14[class.temporary]/5:
引用绑定到的临时对象或作为引用绑定到子对象的完整对象的临时对象仍然存在参考的使用寿命,除外:
构造函数的ctor初始值设定项中到引用成员的临时绑定将持续存在,直到构造函数退出。
[…]
cppreference.com说:
构造函数初始值设定项中引用成员的临时绑定列表只会持续到构造函数退出,而不会持续到对象存在。
http://en.cppreference.com/w/cpp/language/reference_initialization
生存期仅扩展到B
的编译器生成器构造函数的末尾。当构造函数返回时,为保存"def"而创建的临时字符串将被销毁,留下一个悬空引用。
相关文章:
- 延长变量的生存期
- dll 中静态成员变量的生存期
- constexpr 表达式和变量生存期,G++ 和 Clang 不同意的一个例子
- 函数中静态变量的生存期
- C++ 中静态局部变量的范围和生存期
- 封闭环变量的生存期和范围是什么
- 指针是否延长了自动存储变量的生存期
- 静态变量生存期、文件范围与函数范围
- 块内变量的生存期是多少
- 使函数内联是否会影响绑定到其参数的临时变量的生存期
- C++向量、常量字符*、变量范围和生存期
- C++ 了解变量生存期和绑定生存期之间的区别
- 变量的范围与生存期
- 堆栈变量生存期好奇的例子
- C++临时变量生存期
- 变量的恒定性及其生存期
- 未扩展常量引用变量的生存期
- 在c++中,没有变量名的构造函数调用的生存期/作用域是什么?
- 单例类的成员变量的生存期是多少?
- 什么决定临时变量的生存期何时扩展为常量引用或重值引用