[[nodiscard]] 类型背后的基本原理是什么?

What is the rationale behind having [[nodiscard]] types?

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

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

If [[nodiscard]] is marked on a type, it makes it so that all functions that return that type are implicitly [[nodiscard]].

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

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

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

这属于 "manages resources" 类别。

但这也是一个类型的示例,如果 return 从函数中编辑,我们不想丢弃它:

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,因为它可能是我们调用函数时的错误return 对我们来说是对资源的控制,只是为了通过不使用 return 值立即释放该资源。