[求助] C++ std::move 问题 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
yippee0539
V2EX    C++

[求助] C++ std::move 问题

  •  
  •   yippee0539 329 天前 2562 次点击
    这是一个创建于 329 天前的主题,其中的信息可能已经有所发展或是发生改变。

    为什么

    std::fstream file_("path_to_file"); std::string content_ = std::move(std::string(std::istreambuf_iterator<char>(file_), std::istreambuf_iterator<char>()));

    执行之后 file_为 null 了

    这里构造的 string 临时变量应该跟 fie_没有关系才对吧

    10 条回复    2024-11-16 12:22:35 +08:00
    yippee0539
        1
    yippee0539  
    OP
       329 天前
    ```
    std::string i = "asdga";
    std::string j = "asgwqet";
    std::string k = std::move(std::string(j.begin(), j.end()));
    ```
    这个执行之后 j 还是 j ,不为空
    mrwhyzzz
        2
    mrwhyzzz  
       329 天前
    @yippee0539 因为你 move 的是一个新的 string ,std::string(j.begin(), j.end()),相当于新建了一个 string ,拷贝的 j 的内容
    mainjzb
        3
    mainjzb  
       329 天前
    因为 move 不应该叫 move

    move 底层就是个类型强转,把对象标记为右值。
    std::move 本身不改变对象的状态。
    实际的状态变化由类型的移动构造函数或移动赋值操作符决定。

    万一你输入的是 std::move(std::string(j.begin(), j.end() -1 )); // 大概不这么写
    少一个字母。又该如何呢。
    所以显然用 iterate 的情况下移动构造函数仅进行了复制。
    yippee0539
        4
    yippee0539  
    OP
       329 天前
    额,file 不是 null ,是直接到 EOF 了
    yippee0539
        5
    yippee0539  
    OP
       329 天前
    @mainjzb 涨知识了
    leonshaw
        6
    leonshaw  
       329 天前
    file_ 一个对象怎么会是 null
    nlzy
        7
    nlzy  
       329 天前
    这个和 move 没有任何关系,std::move(std::string(...)) 中的 std::string(...) 本身就已经是可移动的右了。在这个场景下有没有 std::move 都是一样的

    file_ 变 eof 是因为 istreambuf_iterator 把文件流的内容读完了,读完之后就是 eof 。
    geelaw
        8
    geelaw  
       329 天前 via iPhone   1
    @nlzy #7 和 move 没关系,EOF 的部分也对,但是 move 是有(不好的)效果的。

    如果写 string s = string(…, …);
    那么 C++17 下等价于 string s{…, …};
    不存在“临时变量构造完再移动”的过程。

    如果写 string s = move(string(…, …));
    那么现行标准下含义是先构造临时变量再移动,且是不可省略移动的情况。
    nlzy
        9
    nlzy  
       329 天前
    @geelaw 谢谢提醒,之前只知道 return std::move(local_variable); 会有不好的效果
    bruce0
        10
    bruce0  
       328 天前
    @nlzy return std::move(local_variable);

    这种写法好像不需要, 一般都会使用 ROV 优化
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2967 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 25ms UTC 12:13 PVG 20:13 LAX 05:13 JFK 08:13
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86