【问题标题】:Why is there a std::move in both <algorithm> and <utility>为什么 <algorithm> 和 <utility> 中都有 std::move
【发布时间】:2020-03-18 20:05:49
【问题描述】:

大多数时候我看到std::move 发布在这里,它引用&lt;utility&gt; 版本。

std::move in &lt;algorithm&gt; 实际上就像它的名字所暗示的那样,move,而 std::move in &lt;utility&gt; 将其参数转换为一个 xvalue,这基本上只是最终将 xvalue 移动到一个左值的预处理步骤.那么当它们的功能不同时,将它们命名为move 是不是有点令人困惑?

【问题讨论】:

  • 是的,move 应该被称为 make_rvalue 或类似的东西。一次又一次地解释单个参数 std::move 实际上并没有移动任何东西,这令人沮丧。
  • &lt;algorithm&gt; 中的那个只是应用于整个范围的&lt;utility&gt; 中的那个。
  • @KaenbyouRin 是的,但&lt;algorithm&gt; 中的那个实际上确实执行了移动(假设为我们移动的类型定义了移动赋值运算符)。
  • 热门:他们应该让std::move 成为运算符而不是库函数。任何比std::move 更好的名字都会更长,这很糟糕。

标签: c++ move c++-standard-library


【解决方案1】:

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

这可能会让人感到困惑,尤其是那些不习惯支持重载的语言的人。确实,编程指南通常不鼓励具有不同含义的重载。

但是要知道有两个同名的函数也不是很难,尽管这是主观的。不同的参数列表提供了足够的上下文来轻松识别另一个。

为什么两者都有std::move

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

std::move 是表达这两个功能的一种非常简洁的方式。 &lt;algorithm&gt; 中的一个与同一标题中的 std::copy 互补。

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

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

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

【讨论】:

    猜你喜欢
    • 2014-02-16
    • 1970-01-01
    • 2011-08-30
    • 2012-07-28
    • 2021-08-17
    • 2012-12-01
    • 2020-12-23
    • 1970-01-01
    相关资源
    最近更新 更多