c++17中的属性[[nodiscard]]的作用及说明

 更新时间:2025年10月23日 09:23:20   作者:赵民勇  
这篇文章主要介绍了c++17中的属性[[nodiscard]]的作用及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

在 C++17 中,[[nodiscard]] 是一个属性(attribute),用于向编译器表明某个函数的返回值不应该被忽略(丢弃)。

主要作用

1. 强制检查返回值

当函数被声明为 [[nodiscard]] 时,如果调用者没有使用返回值,编译器会产生警告。

[[nodiscard]] int calculateImportantValue() {
    return 42;
}

void example() {
    calculateImportantValue();  // 警告:忽略了 nodiscard 函数的返回值
    int result = calculateImportantValue();  // 正确:使用了返回值
}

2. 应用于类/结构体

可以将 [[nodiscard]] 应用于整个类,这样该类的所有构造函数返回值都不应被忽略。

class [[nodiscard]] ImportantResource {
public:
    ImportantResource() { /* 获取资源 */ }
    ~ImportantResource() { /* 释放资源 */ }
};

void example() {
    ImportantResource();  // 警告:创建了临时对象但立即销毁
    ImportantResource res;  // 正确:有名字的对象
}

3. 应用于枚举

也可以将 [[nodiscard]] 应用于枚举类型。

enum class [[nodiscard]] ErrorCode {
    Success,
    Failure
};

ErrorCode performOperation() {
    return ErrorCode::Success;
}

void example() {
    performOperation();  // 警告:忽略了返回值
}

实际应用场景

资源管理

class FileHandle {
public:
    [[nodiscard]] static FileHandle open(const char* filename) {
        // 打开文件
        return FileHandle(/* ... */);
    }
    
    void close() { /* 关闭文件 */ }
};

void example() {
    FileHandle::open("file.txt");  // 警告:文件句柄被立即丢弃!
    
    // 正确用法
    auto handle = FileHandle::open("file.txt");
    // 使用文件...
    handle.close();
}

错误处理

[[nodiscard]] bool initializeSystem() {
    // 系统初始化
    return true; // true 表示成功
}

void example() {
    initializeSystem();  // 警告:没有检查初始化是否成功
    
    if (!initializeSystem()) {  // 正确:检查返回值
        // 处理错误
    }
}

内存分配

class MemoryManager {
public:
    [[nodiscard]] void* allocate(size_t size) {
        return malloc(size);
    }
};

void example() {
    MemoryManager manager;
    manager.allocate(1024);  // 警告:内存泄漏风险!
    
    void* ptr = manager.allocate(1024);  // 正确
    // 使用内存...
    free(ptr);
}

编译器支持

  • GCC 7+
  • Clang 3.9+
  • MSVC 2017 15.3+

总结

[[nodiscard]] 是一个很有用的属性,它可以帮助:

  • 防止资源泄漏
  • 强制错误检查
  • 提高代码安全性
  • 在编译时捕获潜在的错误

通过合理使用这个属性,可以编写出更安全、更健壮的 C++ 代码。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • C++中std::tuple和std::pair的实现

    C++中std::tuple和std::pair的实现

    std::tuple和std::pair是两种极具实用性的数据结构,本文主要介绍了C++中std::tuple和std::pair的实现,具有一定的参考价值,感兴趣的可以了解一下
    2025-02-02
  • 去掉vs2010中ipch文件和.sdf文件的解决方法

    去掉vs2010中ipch文件和.sdf文件的解决方法

    本篇文章介绍了,在vs2010中产生的ipch文件和.sdf文件的解决方法。需要的朋友参考下
    2013-05-05
  • C++ 基础函数的介绍及使用(Vector+deque+STL)

    C++ 基础函数的介绍及使用(Vector+deque+STL)

    这篇文章主要介绍了C++ 基础函数的介绍及使用(Vector+deque+STL),文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-06-06
  • C语言栈与队列相互实现详解

    C语言栈与队列相互实现详解

    栈和队列,严格意义上来说,也属于线性表,因为它们也都用于存储逻辑关系为 "一对一" 的数据,但由于它们比较特殊,本章讲解分别用队列实现栈与用栈实现队列
    2022-04-04
  • Qt信号与槽知识点总结归纳

    Qt信号与槽知识点总结归纳

    信号和槽是一种高级接口,应用于对象之间的通信,它是QT的核心特性,下面这篇文章主要给大家介绍了关于Qt信号与槽知识点总结归纳的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-12-12
  • C语言实现查询自动售货机中的商品价格【实例分享】

    C语言实现查询自动售货机中的商品价格【实例分享】

    本文主要介绍了C语言实现查询自动售货机中的商品价格的相关资料。具有很好的参考价值。下面跟着小编一起来看下吧
    2017-04-04
  • C语言数据结构之平衡二叉树(AVL树)实现方法示例

    C语言数据结构之平衡二叉树(AVL树)实现方法示例

    这篇文章主要介绍了C语言数据结构之平衡二叉树(AVL树)实现方法,结合实例形式分析了C语言平衡二叉树的相关定义与使用技巧,需要的朋友可以参考下
    2018-01-01
  • c++中的volatile和variant关键字详解

    c++中的volatile和variant关键字详解

    大家好,本篇文章主要讲的是c++中的volatile和variant关键字详解,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下
    2022-01-01
  • C语言实现自行车管理系统

    C语言实现自行车管理系统

    这篇文章主要为大家详细介绍了C语言实现自行车管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-08-08
  • C语言控制台实现字符飞机大战

    C语言控制台实现字符飞机大战

    这篇文章主要为大家详细介绍了C语言控制台实现字符飞机大战,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-12-12

最新评论