返回对临时对象成员的const引用
returning const reference to a member of a temporary object
返回临时对象成员的const引用时会发生什么?对象的生命周期是多少?
。
struct temp
{
T m_mine;
static temp make()
{
return temp();
}
};
T const & foo()
{
return temp::make().m_mine;
}
c++98和c++11的行为是什么?
对象或裁判类型的连续性在此上下文中无关紧要:它只是返回对当时已不存在的对象的引用。使用引用则是未定义行为。
同样,如果将成员引用绑定到const对象,则不会延长仲裁对象的生命周期。
对象生命周期扩展仅适用于将局部引用绑定到对象的情况,并且仅适用于引用const
对象或右值引用的情况。
示例代码在我写这篇文章的时候,有几个问题。请只发布真实代码(尽可能)。它应该被粘贴,而不是重新键入。
(另外,由于现在至少有两个答案涉及代码的问题,如果不改变答案的上下文从而使其无效,则纠正它为时已晚。因此,在原始发布中获得正确的代码非常重要。
您的代码在编译之前在多个帐户中是不正确的:
- 类型声明后至少缺少一个分号
- 代码使用非
static
成员make()
,就好像它是static
函数
一旦解决了这个问题:返回的引用指向一个对象的子对象,该对象在return
语句执行之后,在任何东西可以控制它之前被销毁。也就是说,有一个过时的引用返回。对该引用的任何访问都将导致未定义的行为。如果幸运的话,程序此时会崩溃。如果你运气不好,它会发生你希望发生的事情。例如,在向客户或投资者演示程序之前,它可能会"工作",此时它可能会决定宁愿显示侮辱。
相关文章:
- 将const引用参数初始化为默认参数会导致悬空引用吗
- 为什么当我为 for(auto& it : myUnorderedMap) {... = std::move(it.second)} 时,我会得到一个 const 引用?
- 将对象传递给函数而不将其包装到 std::ref 中,而参数被指定为 const 引用
- 如何在构造函数中传递 const 引用时强制编译器不接受右值
- 为什么我需要三个嵌套的大括号来调用赋值运算符,将const引用到二维数组
- 对临时对象的Const引用不会延长其生存期
- 对 const 引用参数使用默认值会导致崩溃
- 在运算符重载中使用带有 const 引用的 friend 函数
- C++通过 const 引用传递时不调用派生类函数
- 具有字符串文本构造函数的类不适用于 const 引用初始化
- 为什么要返回对小类成员的 const 引用?
- C - 最好将枚举类作为值或const引用
- RVO:返回由值传递的值,即使显式分配给 const 引用也是如此
- const引用与可变成员的对象
- 每当传递lvalue时,每当通过rvalue传递时,将const引用存储
- 对类成员而不是 getter 的 Const 引用
- 从类型 'Matrix&' 的右值初始化 类型的非 const 引用无效 'Matrix'
- 在函数中使用 const 引用参数访问函数中成员的最佳实践 C++.
- STD ::配对的const引用如何工作
- 为什么我的C 函数拒绝返回const引用