52

我最近[[nodiscard]]在 C++17 中读到过,据我了解,这是一个新功能(按合同设计?),它迫使您使用返回值。这对于像 (nodiscard since C++20) 这样的有争议的函数是有意义的std::launder,但我想知道为什么std::move在 C++17/20 中没有这样定义。你知道一个很好的理由还是因为 C++20 还没有最终确定?

4

2 回答 2

52

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

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

MSVC 确实将两者都标记std::move()std::forward()遵循[[nodiscard]]这些标准。

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

于 2019-04-20T18:52:56.007 回答
32

AFAIK P0600R1是添加[[nodiscard]]到适用于 C++20 的标准库的唯一提案。从那篇论文:

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

[...]

在以下情况下不应添加:

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

所以,[[nodiscard]] 不应该发出错误代码,如果这

  • [...]
  • 没有伤害,可能没有状态变化意味着不会发生

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

于 2019-04-20T13:05:30.437 回答