【发布时间】:2020-09-21 17:51:01
【问题描述】:
#include <utility>
template <typename Container>
decltype(auto) index(Container &&arr, int n) {
return std::forward<Container>(arr)[n];
}
进行函数调用:
#include <vector>
index(std::vector {1, 2, 3, 4, 5}, 2) = 0;
当函数调用完成时,对象std::vector {1, 2, 3, 4, 5} 将被销毁,将值分配给已释放的地址会导致未定义的行为。但是上面的代码运行良好,valgrind 什么也没检测到。也许编译可以帮助我制作另一个不可见的变量,例如
auto &&invisible_value {index(std::vector {1, 2, 3, 4, 5}, 2)};
invisible_value = 9;
如果我的猜测不正确,我想知道为什么将值分配给从函数返回的右值引用是有效的,以及临时对象 index(std::vector {1, 2, 3, 4, 5}, 2) 何时会被销毁。
这个想法源于《Effective Modern C++》,Item3:了解decltype。
【问题讨论】:
-
如果您无法在不存储函数的情况下访问函数的返回值,您如何想象函数链的工作原理?在这种情况下,您返回右值引用的事实并不真正相关。右值引用也是左值。
标签: c++ c++11 c++14 rvalue-reference rvalue