我最近[[nodiscard]]
在 C++17 中读到过,据我了解,这是一个新功能(按合同设计?),它迫使您使用返回值。这对于像 (nodiscard since C++20) 这样的有争议的函数是有意义的std::launder
,但我想知道为什么std::move
在 C++17/20 中没有这样定义。你知道一个很好的理由还是因为 C++20 还没有最终确定?
问问题
2605 次
2 回答
52
自 VS 2017 15.6 以来,MSVC 标准库团队继续添加了数千个实例[[nodiscard]]
,并报告说它取得了巨大的成功(在发现大量错误和不产生用户投诉方面)。他们描述的标准大约是:
- 纯观察者,例如
vector::size()
,vector::empty
,甚至std::count_if()
- 获取原始资源的事物,例如
allocate()
- 丢弃返回值极有可能导致错误代码的函数,例如
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 回答