【发布时间】:2020-11-22 00:18:28
【问题描述】:
[[nodiscard]] 属性对操作符是必需的吗?或者假设编译器会像对大多数可疑丢弃的东西一样发出警告是否安全?
例如一个重载的operator+,应该应用该属性吗?诸如函数转换运算符或新运算符之类的特殊运算符呢?什么时候学究气了?
【问题讨论】:
-
取决于调用代码来调用这些运算符函数而不使用它们返回的内容是否有意义。例如,在二进制
operator+()的情况下,与some_result = a + b相比,a + b形式的语句(不使用operator+()返回的任何内容)是否有意义?如果它对您的课程没有意义,您可能希望将[[nodiscard]]属性添加到operator+() -
从来没有必要
-
@Peter 在我的情况下,我不会重载运算符,因为它的运行方式与原语的运行方式不同。换句话说,
operator+永远不应该被丢弃。也就是说,我几乎看不到任何使用 nodiscard 属性的代码,我想知道这是因为它默认为 on。 -
@lajoh90686 - 您认为该课程的用户多久会使用一次
operator+()并丢弃结果?是否存在这样做的显着(但这是为您的程序指定的)缺点的情况?如果答案是“不经常”和“否”——我认为这在实践中很常见——那么这些运营商被标记为[[nodiscard]] -
如果丢弃结果不是错误,请不要使用
[[nodiscard]]。当[[nodiscard]]有用时,很好的例子是operator new和std::async。operator+看起来不太适合[[nodiscard]]。推荐阅读:N.Josuttis.[[nodiscard]]in the library.