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

21 小时 44 分钟前
 yippee0539

为什么

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_没有关系才对吧

624 次点击
所在节点    C++
10 条回复
yippee0539
21 小时 43 分钟前
```
std::string i = "asdga";
std::string j = "asgwqet";
std::string k = std::move(std::string(j.begin(), j.end()));
```
这个执行之后 j 还是 j ,不为空
mrwhyzzz
21 小时 27 分钟前
@yippee0539 因为你 move 的是一个新的 string ,std::string(j.begin(), j.end()),相当于新建了一个 string ,拷贝的 j 的内容
mainjzb
21 小时 23 分钟前
因为 move 不应该叫 move

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

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

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

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

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

这种写法好像不需要, 一般都会使用 ROV 优化

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1089886

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX