gpt4 book ai didi

c++ - 拥有 [[nodiscard]] 类型的理由是什么?

转载 作者:行者123 更新时间:2023-12-02 09:55:33 27 4
gpt4 key购买 nike

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

关于类型,[[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);

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

但这也是一个我们不希望从函数返回时丢弃的类型的示例:
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,因为当我们调用一个返回给我们对资源的控制权的函数时,它可能是一个错误,只是通过不使用返回值。

关于c++ - 拥有 [[nodiscard]] 类型的理由是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60442748/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com