当前位置: 首页 > article >正文

C++那些事之nodiscard

C++那些事之nodiscard

自C++17引入[[nodiscard]]属性以来,我们在编写API时有了一种更强大的工具,用于标记那些在调用时不应该被忽略的函数返回值。在本文中,我们将深入探讨[[nodiscard]]的用法,并注意一些潜在的陷阱。

什么是[[nodiscard]]?

[[nodiscard]]是一种函数属性,它告诉编译器函数的返回值不应该被忽略。这在那些依赖于返回值的函数中尤为有用,例如谓词函数或工厂函数。

如何使用[[nodiscard]]?

在类、构造函数以及枚举上使用[[nodiscard]]都是可能的。下面是一些示例:

class [[nodiscard]] A {};

class B {
public:
    [[nodiscard]] B() = default;
};

enum class [[nodiscard]] State {
    Default,
    Foo,
    Bar
};

在上述例子中,编译器将在返回值被忽略时发出警告,有助于我们及早发现潜在的bug。

警惕:[[nodiscard]]的陷阱

尽管[[nodiscard]]可以有效地防止返回值被无意中忽略,但我们需要注意一些潜在的陷阱。一个常见的陷阱是使用[[nodiscard]]的函数返回一个类似于作用域scop guard的对象,以在作用域结束时执行清理操作(比如提交事务)。

[[nodiscard]] ScopeGuard createScopeGuard() {
    // Implementation of a scope guard
}

// 在这里,用户可以选择忽略返回值,导致作用域立即销毁,从而失去清理效果
std::ignore = createScopeGuard();

尽管[[nodiscard]]表明函数返回值不应该被忽略,但用户仍然可以通过std::ignore等手段明确地忽略返回值,从而绕过清理操作。

完整示例

#include <tuple> // std::ignore

class [[nodiscard]] A {};
class B {
public:
    [[nodiscard]] bool isOk() const { return true; }
};

// no need for nodiscard, A is nodiscard
A foo() {
    return A();
}

// B is not nodiscard, mark it explicitly
[[nodiscard]] B bar() {
    return B();
}

int main()
{    
    foo(); // warning: ignoring temporary created by a constructor declared with 'nodiscard' attribute
    bar(); // warning

    std::ignore = foo(); // ok
    auto b = bar(); // ok
    b.isOk(); // warning
    if (b.isOk()) {} // ok
}

更多有趣练习与学习,欢迎咨询~

bcc6133b8c5d3ed4e5b4e88b19543819.jpeg

C++学习社群社群:

8f749c97bde6f42a96e91efd40df6cb2.jpeg


http://www.kler.cn/a/152313.html

相关文章:

  • neo4j使用之超神之旅
  • excel+requests管理测试用例接口自动化框架
  • Flask SocketIO 实现动态绘图
  • python——第十五天
  • 怎样做好信用卡汽车分期业务营销
  • C++ 单词拆分
  • PHP开源问答网站平台源码系统 源码全部开源可二次开发 附带完整的搭建教程
  • mysql中字符串截取与拆分
  • LeetCode695. Max Area of Island
  • 嵌入式Linux:配置Ubuntu系统环境和安装开发工具
  • SpringBoot 整合 Neo4j 实战(头歌)
  • 【idea】设置鼠标滚轮控制缩放大小
  • Node.js 的 https 模块介绍
  • BUUCTF [GXYCTF2019]BabySQli 1 详解!(MD5与SQL之间的碰撞)
  • TCP传输的三次握手四次挥手策略
  • spring框架的事务传播级别经典篇
  • Mysql锁
  • Panalog 日志审计系统 前台RCE漏洞复现
  • MySQL三大日志详细总结(redo log undo log binlog)
  • Linux信号超详细剖析