4

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

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

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

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

4

1 回答 1

6

考虑类型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!
}

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

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

于 2020-02-27T22:56:16.453 回答