考虑类型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,因为当我们调用一个返回给我们对资源的控制权的函数时,这可能是一个错误,只是通过不使用返回值。