为函数返回的右值引用赋值

Assign a value to an rvalue reference returned from function

#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++》,第3条:理解decltype

你说 "When function calling finished, the object vector {1, 2, 3, 4, 5} will be destroyed" 但那不是真的。为函数调用创建的临时文件不会被删除,直到语句结束,即下一行代码。否则想象一下有多少代码会破坏传递 c_str() 的临时字符串。

invisible_value = 9; 是完全合法的分配,因为 9 确实是临时的。右值引用可以分配一个临时但不绑定到左值(例如变量;但您可以像下面这样实现:

int a =10;
invisible_value=std::move(a);

https://godbolt.org/z/iTNGFr. Mode detailed explanation in this question C++ Double Address Operator? (&&).

edit:

the assignment is only legal if it is in the same scope. invisible_value in this case refers to something that was in the scope of index function and it's behavior is undefined if you have a reference to it.