Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/128.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 拥有[[nodiscard]]类型背后的基本原理是什么?_C++_Attributes_C++17 - Fatal编程技术网

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

C++ 拥有[[nodiscard]]类型背后的基本原理是什么?,c++,attributes,c++17,C++,Attributes,C++17,在哪些用例中使用[[nodiscard]]类型是有益的 在类型上,[[nodiscard]]如果任何返回该类型实例的函数的返回值被忽略,则会发出警告;引用自p0068r0: 如果在类型上标记了[[nodiscard]],则会使返回该类型的所有函数隐式 [[nodiscard]] 虽然[[nodiscard]]构造函数c++2a对于管理资源的类非常有用,例如,unique_ptr和nodiscard for functions对于make_unique非常有用,但我无法给出一个示例,说明某个类型的

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

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

如果在类型上标记了[[nodiscard]],则会使返回该类型的所有函数隐式 [[nodiscard]]

虽然[[nodiscard]]构造函数c++2a对于管理资源的类非常有用,例如,unique_ptr和nodiscard for functions对于make_unique非常有用,但我无法给出一个示例,说明某个类型的nodiscard是有用的,我对使用它的情况很感兴趣。

考虑std::unique_lock类型。很明显,它可以标记构造函数,特别是使用M&NodeCard的构造函数,因为我们不希望意外地编写这样的代码:

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,因为当我们调用一个函数返回对资源的控制时,这可能是一个bug,而该函数只是通过不使用返回值立即释放该资源。

考虑类型std::unique\u lock。很明显,它可以标记构造函数,特别是使用M&NodeCard的构造函数,因为我们不希望意外地编写这样的代码:

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,因为当我们调用一个函数返回对资源的控制时,这可能是一个bug,仅仅是为了通过不使用返回值立即释放该资源。

可能是错误类型?这样,任何返回错误类型的函数都不需要进行标记,而且您不能忘记标记返回该类型的函数。可能是错误类型?这样,任何返回错误类型的函数都不需要标记,而且您不能忘记标记返回该类型的函数。