![](/img/trans.png)
[英]Strange behavior of std::initializer_list of std::strings
[英]strange std::list iteration behavior
#include <list>
#include <iostream>
#include <utility>
#include <conio.h>
std::list<int>&& asd()
{
std::list<int> a{ 4, 5, 6 };
return std::move( a );
}
int main()
{
std::list<int> a{ 1, 2, 3 };
std::list<int> &&b = std::move( a );
for( auto &iter : b )
{ std::cout<<iter<<' '; }
std::list<int> &&c{ asd() };
for( auto &iter : c )
{ std::cout<<iter<<' '; _getch(); }
}
这是我的程序输出:
1 2 3
4 3502376 454695192 3473720 4 3502376 454695192 3473720 4 3502376 454695192 3473720 4
std::list<int> a{ 4, 5, 6 };
这个 object 是在这个 function 内部声明的,所以当 function 返回时它被销毁了。
std::list<int>&& asd()
这个 function 返回一个右值引用。 对一些未指定的 object 的引用。
这里发生的事情是当这个 function 返回时这个“未指定的对象”被销毁,所以调用者最终持有对被销毁的 object 的引用。
return std::move( a );
肮脏的小秘密是std::move()
实际上并没有移动任何东西。 它从来没有,它永远不会。 std::move()
所做的只是将其参数转换为rvalue
引用。 无论 object 是否移动,都需要其他多米诺骨牌落到位。 std::move()
仅提供了拼图的一部分,但此拼图的所有其他部分都必须存在才能使实际移动发生。
在这里,拼图的其他部分不存在。 因此,没有任何东西被移动。 返回对已销毁的 object 的引用,随后对已销毁的 object 的所有使用都会导致未定义的行为。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.