[英]Is nodiscard necessary on operators?
运算符是否需要[[nodiscard]]
属性? 或者假设编译器会像对大多数可疑丢弃的东西一样发出警告是否安全?
例如重载的operator+
,是否应该应用该属性? 诸如函数转换运算符或新运算符之类的特殊运算符呢? 什么时候学究气?
永远不需要添加[[nodiscard]]
属性。 从cppreference :
如果 function 声明 nodiscard 或 function 返回枚举或 class 声明 nodiscard by value 被调用以避免从丢弃的编译器发出警告以外的警告。
注意最后一部分:“......鼓励编译器发出警告。” 就标准而言,不能保证实际上会有警告。 它是一个实施质量问题。 如果您的编译器确实发出警告(阅读文档)并且您将此类警告视为错误,那么[[nodiscard]]
可能会有很大用处。
在丢弃返回只是潜在错误的操作符上使用该属性是迂腐的。 我只会在调用运算符时使用它并且丢弃结果总是一个逻辑错误。 许多运算符仅使用返回值来启用链接,而[[nodiscard]]
宁愿成为此类运算符的烦恼。 在某些情况下,决定并不那么明显,您选择什么是意见和风格的问题。
让我引用 N.Josuttis 的以下论文:“ [[nodiscard]]
in the library ”(有一些遗漏,请参阅全文):
C++17 引入了
[[nodiscard]]
属性。 问题是,现在在标准库中的何处应用它。 应在以下位置添加:
- 不使用返回值总是一个“巨大的错误”(例如总是导致资源泄漏),
- 不使用返回值是麻烦的根源,而且很容易发生(不明显有问题)。
在以下情况下不应添加:
- 至少对于某些输入,不使用返回值是一种可能/常见的编程方式,
- 不使用返回值是没有意义的,但不会造成伤害,通常也不是错误。
所以,
[[nodiscard]]
不应该发出错误代码,如果这
- 不使用返回值可能很有用,
- 不使用返回值是常见的,
- 没有伤害,可能没有 state 更改意味着不会发生。
运营商是否需要nodiscard?
不,nodiscard 和其他属性是可选的。
或者假设编译器会像对大多数可疑丢弃的东西一样发出警告是否安全?
除非程序格式不正确,否则无法保证语言中的任何警告。
我也不会假设没有 nodiscard 的警告,因为在很多情况下操作结果被故意丢弃。 一个常见的例子:
a = b; // result of assignment was discarded
事实上,如果所有丢弃的结果都导致警告,那么 nodiscard 属性就没有任何用途。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.