[[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 值立即释放该资源。
在哪些用例中使用 [[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 值立即释放该资源。