【问题标题】:What is the rationale behind having [[nodiscard]] types?拥有 [[nodiscard]] 类型的理由是什么?
【发布时间】:2020-06-12 00:40:23
【问题描述】:

在哪些用例中使用[[nodiscard]] 类型是有益的?

在类型上,如果任何返回该类型实例的函数的返回值被省略,[[nodiscard]] 会发出警告; (引自 p0068r0):

如果 [[nodiscard]] 被标记在一个类型上,它使得所有返回该类型的函数都是隐式的 [[nodiscard]]。

虽然 [[nodiscard]] 构造函数 (c++2a) 对于管理资源的类(例如 unique_ptr)非常有用,而函数的 nodiscard 对 make_unique 很有用,但我想不出一个例子类型的 nodiscard 很有用,我对使用它的情况感兴趣。

【问题讨论】:

  • 可能是错误类型?这样,任何返回错误类型的函数都不需要标记,而且你不能忘记标记返回该类型的函数。

标签: c++ attributes c++17 nodiscard


【解决方案1】:

考虑类型std::unique_lock<M>。它是标记构造函数(特别是采用M& 的构造函数)nodiscard 的明显候选者,因为我们不希望意外地编写一些这样的代码:

std::unique_lock<M>(m);
// oops! we actually meant
// std::unique_lock<M> lck(m);

这属于“管理资源”类别。

但这也是我们不希望从函数返回时丢弃的类型的示例:

std::unique_lock<M> getLockFor(Arg x) {
    std::unique_lock<M> result;
    // acquire some lock based on x
    return result;
}

{
    auto lck = getLockFor(arg1);  // ok
    // do some stuff that requires the lock to be held
}
{
    getLockFor(arg2);  // warning!
    // lock will NOT be held here!
}

要在这种情况下获得警告,我们需要将 type 标记为 nodiscard,而不仅仅是构造函数。

我认为,事实上,这个例子说明了也许大多数管理资源的类应该是nodiscard,因为当我们调用一个返回给我们对资源的控制权的函数时,它可能是一个错误,只是通过不使用返回值来立即释放该资源。

【讨论】:

    猜你喜欢
    • 2012-10-13
    • 1970-01-01
    • 2019-08-14
    • 2020-08-06
    • 2013-01-31
    • 2010-10-13
    • 2021-07-06
    • 1970-01-01
    相关资源
    最近更新 更多