const引用右值的类数据成员的生命周期是多少?
What is the lifetime of the class data member which const reference to a rvalue?
一般来说,这个讨论只取决于局部函数变量:
void foo (const int &i)
{
// use i till foo() ends
}
foo(3);
但是,这个规则也适用于class
成员吗?
struct A {
const int &a;
A () : a(3) {} // version 1
A (const int &i) : a(i) {} // version 2
};
现在A
用作,
{
return ()? new A : new A(3) : new A(some_local_variable);
}
a
的内容在所有3 new
分配的A
的生命周期内是否保持不变?
c++ 03标准(章节"12.2/5临时对象")恰当地回答了你的问题:
引用所绑定的临时对象或作为临时对象所绑定的子对象的完整对象的临时对象在引用的整个生命周期内持续存在,下面指定的情况除外。在构造函数的参数初始化式(12.6.2)中,与引用成员的临时绑定一直持续到构造函数退出为止。
如果您使用new
分配对象,它将永远保留在内存中-直到您delete
它。它不是一个临时对象。
a
是A
的成员,也是分配的一部分。
struct A {
const int &a;
A () : a(3) {} // version 1
A (const int &i) : a(i) {} // version 2
};
void foo() {
A *pA;
{
int x;
pA = new A(x);
}
// Now pA->a is pointing to the address where `x` used to be,
// but the compiler may very well put something else in this place now
// because x is out of scope.
}
如果A
对象的生命周期跨越多个函数,答案就更明显了。
旁注:我发现"contents"这个词在这里有点模棱两可。将引用等同于指针,因此您的a
基本上指向一个整数。无论是否为const,如果该整数不再存在(因为它在堆栈上并且已被删除),则您的a
-虽然仍然指向内存中的相同地址-现在正在引用其他内容。GotW的文章似乎在讨论编译器延长引用所指向的对象的生命周期。引用本身也是一个指针。
相关文章:
- 复制列表初始化的隐式转换的等级是多少
- while循环中while循环的时间复杂度是多少
- 如何检查一个c++字符串中有多少相同的字符/数字
- C++有多少类型的循环
- 求出有多少个数字是完美平方,而sqrt()是L,R范围内的素数
- 在条件变量中触发错误信号的频率是多少
- 函数的时间复杂度是多少?
- 必须为 C++20 协程帧保留多少内存?
- 对于四轴飞行器,PID中I控制器的理想值应该是多少
- C++,数组有多少个地址?
- 在C++中使用并行化的预期速度是多少(不是 OpenMp,而是 <thread>)
- 在 Linux 中存储区域设置名称的缓冲区大小应该是多少?
- 在内存不足之前,我可以声明多少个 const 变量?
- 传递给 std::runtime_error 的 ctor 的字符串对象的生命周期是多少?
- 确定一个码块需要多少个时钟周期
- 正在读取一个布尔原子以及它需要多少个周期
- c++ lambda表达式的生命周期是多少?
- 在现代x86_64 CPU上进行AVX/SSE幂运算需要多少时钟周期?
- const引用右值的类数据成员的生命周期是多少?
- c++数据结构对象的生命周期是多少?