为什么在<算法>和<utility中都有std::move>

Why is there a std::move in both <algorithm> and <utility>

提问人:24n8 提问时间:3/19/2020 最后编辑:24n8 更新时间:3/19/2020 访问量:1006

问:

大多数时候我在这里看到发布,它引用的是版本。std::move<utility>

<algorithm> 中的 std::move 实际上就像它的名字所暗示的那样,移动,而 <utility> 中的 std::move 将其参数转换为 xvalue,这基本上只是最终将 xvalue 移动到 lvalue 的预处理步骤。那么,当两者的功能不同时,命名这两个是不是有点令人困惑?move

C 移动 C++-标准库

评论

1赞 Brian61354270 3/19/2020
可能相关的问题:为什么 std::swap 从 <algorithm> 移动到 <utility>?
3赞 NathanOliver 3/19/2020
是的,应该被调用或类似的东西。令人沮丧的是,一次又一次地解释单个参数实际上并没有移动任何东西。movemake_rvaluestd::move
0赞 ph3rin 3/19/2020
其中的那个只是应用于整个范围的那个。<algorithm><utility>
1赞 24n8 3/19/2020
@KaenbyouRin 是的,但实际上执行了移动(假设为要移动的类型定义了移动赋值运算符)。<algorithm>
1赞 Brian Bi 3/19/2020
热点:他们应该创建一个运算符而不是库函数。任何比更长的名字更好,这很糟糕。std::movestd::move

答:

9赞 eerorika 3/19/2020 #1

那么,将这两者都命名为 move 是不是有点令人困惑?

这可能会令人困惑,尤其是那些不习惯支持重载的语言的人。诚然,编程准则通常不鼓励具有不同含义的重载。

但是,尽管这是主观的,但要知道有两个同名的功能也不是很困难。不同的参数列表提供了足够的上下文,以便于将一个参数与另一个参数区分开来。

为什么 和 中都有一个 std::move

因为该语言的设计者选择对这两个函数使用相同的名称。

std::move是表达这两种功能的一种非常简洁的方式。in 中的一个是来自同一标头的补充。<algorithm>std::copy

而 std::move in 将其参数转换为 xvalue,这基本上只是最终移动的预处理步骤

描述函数的作用并不是函数名称可以表达的唯一内容。在这种情况下,该名称表达了使用该函数的程序员的意图:如果可能的话,程序员打算从参数 lvalue 中移动。

这是程序员可能需要经常编写的内容;因此,需要非常短的名称。