为函数返回的右值引用赋值
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.
#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.