0

0

C++中的[[nodiscard]]属性有什么用?C++17避免API误用技巧【代码质量】

穿越時空

穿越時空

发布时间:2025-12-26 11:13:02

|

426人浏览过

|

来源于php中文网

原创

[[nodiscard]]是C++17引入的属性,用于标记函数返回值不应被忽略,否则编译器将警告;适用于资源管理、状态返回、工厂函数等场景,可防资源泄漏等低级错误。

c++中的[[nodiscard]]属性有什么用?c++17避免api误用技巧【代码质量】

[[nodiscard]] 是 C++17 引入的属性,用来告诉编译器:这个函数的返回值**不应该被忽略**。一旦调用者没用到它的返回值,编译器就会发出警告(甚至错误,取决于编译选项)。

它解决什么问题?

很多函数的返回值携带关键信息——比如是否成功、分配的资源、转换后的对象、错误码等。但开发者有时会不小心写成:

// 忘记接收返回值,逻辑出错却无提示
std::unique_ptr create_int();
create_int(); // 资源悄悄析构,但没人知道!

这类误用不会报错,运行时才暴露问题,调试成本高。

立即学习C++免费学习笔记(深入)”;

怎么用?加在函数声明上就行

常见适用场景:

Outwrite
Outwrite

AI写作浏览器插件,将您的想法变成有力的句子

下载
  • 返回资源管理对象(std::unique_ptrstd::optional、自定义 RAII 类)
  • 返回状态或结果(如 std::expected、自定义 error_code 类型)
  • 返回必须检查的布尔值(如 try_lock()pop(std::optional&)
  • 工厂函数、转换函数(如 std::string_view::substr()

实际例子对比

不加 [[nodiscard]]:

// 编译通过,但逻辑危险
[[nodiscard]] std::optional find_value(const std::vector& v, int x);
find_value(v, 42); // 没接返回值 → 警告!

加了之后,GCC/Clang/MSVC 都会报类似:

warning: ignoring return value of function declared with 'nodiscard' attribute

小技巧和注意事项

  • 可以加在函数返回类型前,也可以加在函数名后(推荐前者,更清晰)
  • 支持自定义类型:在类定义上加 [[nodiscard]] struct MyResult { ... };,所有返回该类型的函数自动受约束
  • 若确实要忽略,显式转为 void(void)func();static_cast(func());
  • 不是万能的:不能防止“用了但没正确检查”,只能防“完全不用”

基本上就这些。它是轻量但高效的防御性编程手段,花几秒加个属性,就能拦住一大类低级但致命的误用。

相关专题

更多
c语言const用法
c语言const用法

const是关键字,可以用于声明常量、函数参数中的const修饰符、const修饰函数返回值、const修饰指针。详细介绍:1、声明常量,const关键字可用于声明常量,常量的值在程序运行期间不可修改,常量可以是基本数据类型,如整数、浮点数、字符等,也可是自定义的数据类型;2、函数参数中的const修饰符,const关键字可用于函数的参数中,表示该参数在函数内部不可修改等等。

516

2023.09.20

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

311

2023.08.02

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

511

2024.08.29

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

46

2025.08.29

C++中int的含义
C++中int的含义

本专题整合了C++中int相关内容,阅读专题下面的文章了解更多详细内容。

179

2025.08.29

javascriptvoid(o)怎么解决
javascriptvoid(o)怎么解决

javascriptvoid(o)的解决办法:1、检查语法错误;2、确保正确的执行环境;3、检查其他代码的冲突;4、使用事件委托;5、使用其他绑定方式;6、检查外部资源等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

171

2023.11.23

java中void的含义
java中void的含义

本专题整合了Java中void的相关内容,阅读专题下面的文章了解更多详细内容。

92

2025.11.27

function是什么
function是什么

function是函数的意思,是一段具有特定功能的可重复使用的代码块,是程序的基本组成单元之一,可以接受输入参数,执行特定的操作,并返回结果。本专题为大家提供function是什么的相关的文章、下载、课程内容,供大家免费下载体验。

468

2023.08.04

虚拟号码教程汇总
虚拟号码教程汇总

本专题整合了虚拟号码接收验证码相关教程,阅读下面的文章了解更多详细操作。

25

2025.12.25

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
10分钟--Midjourney创作自己的漫画
10分钟--Midjourney创作自己的漫画

共1课时 | 0.1万人学习

Midjourney 关键词系列整合
Midjourney 关键词系列整合

共13课时 | 0.8万人学习

AI绘画教程
AI绘画教程

共2课时 | 0.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号