下面的代码说明了我的担忧:
#include <iostream>
struct O
{
~O()
{
std::cout << "~O()\n";
}
};
struct wrapper
{
O const& val;
~wrapper()
{
std::cout << "~wrapper()\n";
}
};
struct wrapperEx // with explicit ctor
{
O const& val;
explicit wrapperEx(O const& val)
: val(val)
{}
~wrapperEx()
{
std::cout << "~wrapperEx()\n";
}
};
template<class T>
T&& f(T&& t)
{
return std::forward<T>(t);
}
int main()
{
std::cout << "case 1-----------\n";
{
auto&& a = wrapper{O()};
std::cout << "end-scope\n";
}
std::cout << "case 2-----------\n";
{
auto a = wrapper{O()};
std::cout << "end-scope\n";
}
std::cout << "case 3-----------\n";
{
auto&& a = wrapper{f(O())};
std::cout << "end-scope\n";
}
std::cout << "case Ex-----------\n";
{
auto&& a = wrapperEx{O()};
std::cout << "end-scope\n";
}
return 0;
}
看到它住在这里。
据说auto&&
会延长临时对象的寿命,但我找不到这个规则的标准词,至少在N3690中没有。
最相关的可能是关于临时对象的第 12.2.5 节,但不完全是我正在寻找的。
那么,auto&& 生命周期扩展规则是否适用于表达式中涉及的所有临时对象,还是仅适用于最终结果?
更具体地说,a.val
在我们到达案例 1 的范围结束之前,是否保证有效(非悬空)?
编辑: 我更新了示例以显示更多案例(3 & Ex)。
您会看到,只有在情况 1 中,O 的生命周期才会延长。