为什么在 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]]
实例,并报告了它的巨大成功(在发现大量错误和未产生用户投诉方面) .他们描述的标准大约是:
- 纯粹的观察者,例如
vector::size()
、vector::empty
,甚至 std::count_if()
- 获取原始资源的事物,例如
allocate()
- 丢弃 return 值极有可能导致错误代码的函数,例如
std::remove()
MSVC 确实按照这些标准将 std::move()
和 std::forward()
标记为 [[nodiscard]]
。
虽然它在标准中没有正式注释,但它似乎提供了明确的用户利益,而且更多的是制作这样一份文件来标记所有正确的东西的问题 [[nodiscard]]
(同样,数千个实例来自 MSVC)并应用它们——这本身并不复杂,但数量很大。与此同时,也许可以刺激你最喜欢的标准库供应商并要求他们 [[nodiscard]]
很多东西?
我最近读到了 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]]
实例,并报告了它的巨大成功(在发现大量错误和未产生用户投诉方面) .他们描述的标准大约是:
- 纯粹的观察者,例如
vector::size()
、vector::empty
,甚至std::count_if()
- 获取原始资源的事物,例如
allocate()
- 丢弃 return 值极有可能导致错误代码的函数,例如
std::remove()
MSVC 确实按照这些标准将 std::move()
和 std::forward()
标记为 [[nodiscard]]
。
虽然它在标准中没有正式注释,但它似乎提供了明确的用户利益,而且更多的是制作这样一份文件来标记所有正确的东西的问题 [[nodiscard]]
(同样,数千个实例来自 MSVC)并应用它们——这本身并不复杂,但数量很大。与此同时,也许可以刺激你最喜欢的标准库供应商并要求他们 [[nodiscard]]
很多东西?