为什么在 C++20 中 std::move 不是 [[nodiscard]]?

Why is std::move not [[nodiscard]] in C++20?

我最近读到了 C++17 中的 [[nodiscard]],据我所知,这是一个新功能(按合同设计?),它会强制您使用 return 值.这对于像 std::launder 这样有争议的函数是有意义的(从 C++20 开始就没有丢弃),但我想知道为什么 std::move 在 C++17/20 中没有像这样定义。您知道一个很好的理由还是因为 C++20 尚未最终确定?

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

We suggest a conservative approach:

[...]

It should not be added when:

  • [...]
  • not using the return value makes no sense but doesn’t hurt and is usually not an error
  • [...]

So, [[nodiscard]] should not signal bad code if this

  • [...]
  • doesn’t hurt and probably no state change was meant that doesn’t happen

所以原因是标准库使用了一种保守的方法,还没有提出更激进的方法。

自 VS 2017 15.6 以来,MSVC 标准库团队继续添加了数千个 [[nodiscard]] 实例,并报告了它的巨大成功(在发现大量错误和未产生用户投诉方面) .他们描述的标准大约是:

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

MSVC 确实按照这些标准将 std::move()std::forward() 标记为 [[nodiscard]]

虽然它在标准中没有正式注释,但它似乎提供了明确的用户利益,而且更多的是制作这样一份文件来标记所有正确的东西的问题 [[nodiscard]](同样,数千个实例来自 MSVC)并应用它们——这本身并不复杂,但数量很大。与此同时,也许可以刺激你最喜欢的标准库供应商并要求他们 [[nodiscard]] 很多东西?