编写const auto& [a, b] = f();
是否可以保证延长从f()
返回的对象的生命周期,或者至少绑定(bind)了a
和b
对象?仔细阅读the proposal,除非有其他东西覆盖,否则我看不出该语言中有任何明显的东西可以确保我能做到。但是,以下内容不会延长临时文件的生存期,因此我看不到如何覆盖临时文件:
const auto& a = std::get<0>(f());
在本文的顶部,似乎表明已将其覆盖
但是在建议的实际标准措辞中,我在下面看到的最接近的提法是,尽管我不确定如何阅读它以得到我正在寻找的保证:
看起来gcc和clang都可以将返回的对象的生存期延长到基于wandbox experiment的作用域结束为止。一个uglier one实现我自己的类型的所有功能,似乎可以延长外部对象及其其他数据成员的生命周期。
尽管几乎可以肯定作者的意图,但我还是想确切地知道该语言保证了它的安全性。
最佳答案
是。诀窍是要认识到,尽管看起来很漂亮,但[
之前的结构化绑定(bind)声明的部分并不适用于标识符列表中的名称。相反,它们适用于声明隐式引入的变量。 [dcl.struct.bind]/1:
然后将名称定义为e
元素的别名或绑定(bind)到对get
调用e
的结果的引用。
在您的示例中,就好像是by(假设f
返回一个包含两个元素的std::tuple
):
const auto& e = f(); // 1
using E = remove_reference_t<decltype((e))>;
std::tuple_element<0, E>::type& a = get<0>(e);
std::tuple_element<1, E>::type& b = get<1>(e);
(除了对
decltype(a)
和decltype(b)
进行特殊处理以隐藏其引用性之外。)很明显,第1行确实延长了
f
返回值的生命周期。