繁体   English   中英

奇怪的 std::list 迭代行为

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM