c – auto \u0026\u0026如何延长临时对象的生命周期?
下面的代码说明了我的担忧:
#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-scopen"; } std::cout << "case 2-----------n"; { auto a = wrapper{O()}; std::cout << "end-scopen"; } std::cout << "case 3-----------n"; { auto&& a = wrapper{f(O())}; std::cout << "end-scopen"; } std::cout << "case Ex-----------n"; { auto&& a = wrapperEx{O()}; std::cout << "end-scopen"; } return 0; } 看到现场here. 据说汽车&&将延长临时对象的终身时间,但是我在这个规则上找不到标准单词,至少不在N3690中. 最相关的可能是关于临时对象的第12.2.5节,但不完全是我正在寻找的. 那么,自动和&终生时间扩展规则适用于表达式中涉及的所有临时对象,还是仅适用于最终结果? 更具体地说,在我们到达范围1之前,a.val保证是有效的(非悬挂)? 编辑: 你会看到,只有在情况1,O的生命周期被延长. 解决方法
与引用const的方式相同:
const auto& a = wrapper{O()}; 要么 const wrapper& a = wrapper{O()}; 或者也 wrapper&& a = wrapper{O()};
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |