编写const auto& [a, b] = f();是否可以保证延长从f()返回的对象的生命周期,或者至少绑定(bind)了ab对象?仔细阅读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返回值的生命周期。

09-08 00:21