const左值引用类型的非静态成员是否能延长临时对象的生命周期?
const左值引用类型的非静态成员能否延长临时对象的生命周期?
结论:可以,但仅在类对象初始化时,引用成员直接绑定到临时对象的场景下生效
误区澄清
之前看到的“临时对象生命周期延长仅适用于栈上引用,不适用于对象成员引用”的说法并不准确,它混淆了不同的初始化场景——成员引用在特定条件下完全可以触发临时对象的生命周期延长。
代码验证
你给出的测试代码清晰地证明了这一点:
#include <iostream> struct Referred final { ~Referred() { std::cout << "Referred dtor called!\n"; } }; struct Entity final { const Referred &r; }; int main() { Entity e { Referred {} }; std::cout << "The temporary is alive here!\n"; }
在GCC和Clang中的输出为:
The temporary is alive here! Referred dtor called!
输出显示临时对象的生命周期被延长到了main函数中std::cout语句执行之后,也就是和Entity对象e的生命周期一致。
标准依据
C++标准中关于临时对象生命周期的核心规则是:
当引用直接绑定到临时对象,或者绑定到一个其初始化依赖于临时对象的引用成员时,临时对象的生命周期会被延长至该引用的生命周期结束。
你找到的关于递归延长的注释正是这一规则的补充:如果一个临时对象的引用成员绑定了另一个临时对象,生命周期延长会递归作用于该成员的初始化器——这直接印证了成员引用可以触发临时对象的生命周期延长。
失效场景
需要注意,这种生命周期延长仅在引用成员在类对象初始化时直接绑定临时对象的情况下生效,以下场景不会触发延长:
- 引用成员绑定的不是临时对象,而是另一个已经存在的引用或变量;
- 类对象先默认构造(但引用成员必须初始化,所以这种情况本身不合法),之后试图给引用成员赋值(引用成员无法被赋值,只能初始化)。
举个反例:
struct Entity { const Referred& r; }; int main() { const Referred& temp_ref = Referred{}; // 这里temp_ref延长了临时对象的生命周期 Entity e{temp_ref}; // e的r绑定到temp_ref,临时对象的生命周期由temp_ref决定,而非e }
内容的提问来源于stack exchange,提问作者Kaiyakha
相关产品推荐
相关产品推荐

