返回对临时对象成员的 const 引用
returning const reference to a member of a temporary object
返回对临时对象成员的常量引用时会发生什么;该对象的生命周期是多少;
例如
struct temp
{
T m_mine;
static temp make()
{
return temp();
}
};
T const & foo()
{
return temp::make().m_mine;
}
c++98 和 c++11 的行为是什么?
您的代码在编译之前在多个帐户中都是不正确的:
- 类型声明后至少少了一个分号
- 代码使用非
static
成员make()
,就好像它是一个static
函数
一旦克服了这一点:引用 returned 指的是一个对象的子对象,该对象在 return
语句执行后且在任何东西可以获取它之前被销毁。也就是说,有一个过时的引用 return。对该引用的任何访问都将导致未定义的行为。运气好的话,程序就在此时崩溃了。如果你不走运,它会做一些你希望它发生的事情。例如,它可能 "work" 直到程序被展示给客户或投资者,此时它可能决定宁愿表现出侮辱性。
对象或裁判类型的常量性在此上下文中并不重要:它只是 return 对当时已不存在的对象的引用。然后使用引用是未定义的行为。
同样,如果将成员引用绑定到 const 对象,则不会延长引用的生命周期。
对象生命周期延长仅适用于将 local 引用绑定到对象的情况,并且仅适用于引用 const
对象或右值引用的情况。
我写这篇文章时的示例代码有几个问题。请仅 post 真实代码 (尽可能)。并且应该粘贴,而不是重新输入。
(此外,由于现在至少有 2 个答案涉及代码问题,因此在不改变答案的上下文并因此使它们无效的情况下更正它为时已晚。所以它是在原始 posting 中获得正确的代码很重要。下一个 SO 问题值得牢记。)
返回对临时对象成员的常量引用时会发生什么;该对象的生命周期是多少;
例如
struct temp
{
T m_mine;
static temp make()
{
return temp();
}
};
T const & foo()
{
return temp::make().m_mine;
}
c++98 和 c++11 的行为是什么?
您的代码在编译之前在多个帐户中都是不正确的:
- 类型声明后至少少了一个分号
- 代码使用非
static
成员make()
,就好像它是一个static
函数
一旦克服了这一点:引用 returned 指的是一个对象的子对象,该对象在 return
语句执行后且在任何东西可以获取它之前被销毁。也就是说,有一个过时的引用 return。对该引用的任何访问都将导致未定义的行为。运气好的话,程序就在此时崩溃了。如果你不走运,它会做一些你希望它发生的事情。例如,它可能 "work" 直到程序被展示给客户或投资者,此时它可能决定宁愿表现出侮辱性。
对象或裁判类型的常量性在此上下文中并不重要:它只是 return 对当时已不存在的对象的引用。然后使用引用是未定义的行为。
同样,如果将成员引用绑定到 const 对象,则不会延长引用的生命周期。
对象生命周期延长仅适用于将 local 引用绑定到对象的情况,并且仅适用于引用 const
对象或右值引用的情况。
我写这篇文章时的示例代码有几个问题。请仅 post 真实代码 (尽可能)。并且应该粘贴,而不是重新输入。
(此外,由于现在至少有 2 个答案涉及代码问题,因此在不改变答案的上下文并因此使它们无效的情况下更正它为时已晚。所以它是在原始 posting 中获得正确的代码很重要。下一个 SO 问题值得牢记。)