为什么在C ++ 20中std :: move没有[[nodiscard]]?

bba*_*hev 45 c++ language-lawyer c++17 c++20

我最近阅读了[[nodiscard]]C ++ 17,据我了解,它是一项新功能(按合同设计吗?),它迫使您使用返回值。对于有争议的函数std::launder(从C ++ 20开始不丢弃),这是有意义的,但是我想知道为什么std::move在C ++ 17/20 中没有这样定义。您知道很好的理由还是因为C ++ 20尚未完成?

Bar*_*rry 40

[[nodiscard]]自VS 2017 15.6起,MSVC标准库团队继续前进并添加了数千个实例,并报告了该实例的巨大成功(无论是发现大量错误还是不引起用户投诉)。他们描述的标准大约是:

  1. 纯观察者,例如vector::size()vector::empty甚至std::count_if()
  2. 获得原始资源的事物,例如 allocate()
  3. 丢弃返回值的函数极有可能导致错误代码,例如 std::remove()

MSVC做标记都std::move()std::forward()[[nodiscard]]以下这些标准。

尽管它没有在标准中进行正式注释,但它似乎可以为用户带来明显的好处,而更多的问题是编写这样的文件来标记所有正确的内容[[nodiscard]](同样,来自MSVC的数千个实例)并应用它们-这不是本身是复杂的工作,但工作量很大。同时,也许是您最喜欢的标准库供应商,然后问他们[[nodiscard]]很多东西?


cpp*_*ner 30

AFAIK P0600R1是添加[[nodiscard]]到已应用于C ++ 20的标准库的唯一建议。从那篇论文:

我们建议采取保守的方法:

[...]

在以下情况下不应添加:

  • [...]
  • 不使用返回值没有意义,但不会造成伤害,并且通常不是错误
  • [...]

因此,如果[[nodiscard]]不应该发出错误的代码

  • [...]
  • 不会受到伤害,并且可能不会发生状态更改,这意味着不会发生

因此,原因是标准库使用的是保守方法,而尚未提出更具综合性的方法。

  • 我不知道。不使用`std :: move`的返回值在我的书中总是一个错误,因此应根据您的引用将其丢弃:这表明用户忘记使用返回值,或者该调用是不必要的,因为它没有效果。 (4认同)