V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
yippee0539
V2EX  ›  C++

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

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

    为什么

    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 临时变量应该跟 file_没有关系才对吧

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

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

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

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

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

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

    这种写法好像不需要, 一般都会使用 ROV 优化
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1509 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 19ms · UTC 17:07 · PVG 01:07 · LAX 09:07 · JFK 12:07
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.