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标准库团队继续前进并添加了数千个实例,并报告了该实例的巨大成功(无论是发现大量错误还是不引起用户投诉)。他们描述的标准大约是:
vector::size(),vector::empty甚至std::count_if() allocate()std::remove()MSVC做标记都std::move()与std::forward()如[[nodiscard]]以下这些标准。
尽管它没有在标准中进行正式注释,但它似乎可以为用户带来明显的好处,而更多的问题是编写这样的文件来标记所有正确的内容[[nodiscard]](同样,来自MSVC的数千个实例)并应用它们-这不是本身是复杂的工作,但工作量很大。同时,也许是您最喜欢的标准库供应商,然后问他们[[nodiscard]]很多东西?
cpp*_*ner 30
AFAIK P0600R1是添加[[nodiscard]]到已应用于C ++ 20的标准库的唯一建议。从那篇论文:
我们建议采取保守的方法:
[...]
在以下情况下不应添加:
- [...]
- 不使用返回值没有意义,但不会造成伤害,并且通常不是错误
- [...]
因此,如果[[nodiscard]]不应该发出错误的代码
- [...]
- 不会受到伤害,并且可能不会发生状态更改,这意味着不会发生
因此,原因是标准库使用的是保守方法,而尚未提出更具综合性的方法。