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

C++17 nodiscard标记符

文章目录

  • 前言
  • 弃值表达式
  • nodiscard标记符
    • 函数非弃值声明
    • 类/枚举类/结构 非弃值声明
    • 返回类引用与类指针

前言

在C++ 17中引入了一个标记符nodiscard,用于声明一个 “非弃值(no-discard)表达式”。那么在开始之前,我们需要了解一下什么是弃值表达式。

弃值表达式

弃值表达式,就是放弃获取返回值的表达式。首先弃值表达式的返回值是非void类型的。一般,我们使用的弃值表达式,其返回值只是起次要的作用,而其本身的作用占主要。比如++i;就是一个弃值表达式,它的主要作用就是累加,但同时我们也可以选择获取其累加的返回值,只不过这是次要的。

再比如,C标准库的文件写入函数,其声明如下:

int __cdecl fputs(const char * __restrict__ _Str,FILE * __restrict__ _File);

它有一个int类型的返回值,用于获取写入状态,它的主要作用是写入文件,我可以选择不获取状态,也可以选择获取状态:

fputs("Hello World",pFile);
int result = fputs("Hello World",pFile);

nodiscard标记符

那么我如果想向用户建议获取返回值,这时候,我就可以使用nodiscard标记符。它一般用于标记函数的返回值或者某个类。声明语法为:

/* @since C++17 */
[[nodiscard]] return_type function();
/* @since C++20 */
[[nodiscard("message")]] return_type  function();
/* Standard lib defination */
/*  #if __cplusplus >= 201703L# define _GLIBCXX_NODISCARD [[__nodiscard__]]#else# define _GLIBCXX_NODISCARD#endif
*/
_GLIBCXX_NODISCARD return_type  function();

如果一个被nodiscard标记了的表达式,如果我们在使用时弃值了,而且没有使用static_cast<void>将其转化为void时,编译器会抛出warning来提醒用户获取返回值。

函数非弃值声明

[[nodiscard]] int func1(){return 1;
}[[nodiscard("nodiscared function")]] int func2(){return 1;
}int main(){func1();                         //warning C++17func2();                         //warning c++20int a = func1();                 //no warningstatic_cast<void>(func1());      //no warning
}

结果如下:
在这里插入图片描述

类/枚举类/结构 非弃值声明

class [[nodiscard]] A{};
enum class [[nodiscard]] B{X,Y};
struct [[nodiscard]] C{};A createA(){return A();
}B createB(){return B::X;
}C createC(){return C();
}int main(){createA();createB();createC();
}

输出如下:

6.cpp: In function 'int main()':
6.cpp:22:12: warning: ignoring returned value of type 'A', declared with attribute 'nodiscard' [-Wunused-result]22 |     createA();|     ~~~~~~~^~
6.cpp:10:3: note: in call to 'A createA()', declared here10 | A createA(){|   ^~~~~~~
6.cpp:6:21: note: 'A' declared here6 | class [[nodiscard]] A{};|                     ^
6.cpp:23:12: warning: ignoring returned value of type 'B', declared with attribute 'nodiscard' [-Wunused-result]23 |     createB();|     ~~~~~~~^~
6.cpp:14:3: note: in call to 'B createB()', declared here14 | B createB(){|   ^~~~~~~
6.cpp:7:26: note: 'B' declared here7 | enum class [[nodiscard]] B{X,Y};|                          ^
6.cpp:24:12: warning: ignoring returned value of type 'C', declared with attribute 'nodiscard' [-Wunused-result]24 |     createC();|     ~~~~~~~^~
6.cpp:18:3: note: in call to 'C createC()', declared here18 | C createC(){|   ^~~~~~~
6.cpp:8:22: note: 'C' declared here8 | struct [[nodiscard]] C{};|                      ^

返回类引用与类指针

当返回值为引用或者指针的 类/枚举类/结构(函数不行) 时,nodiscard 就无效了:

class [[nodiscard]] A{};A& createAref(){A* a = new A();return *a;
}A* createAptr(){A* a = new A();return a;
}int main(){createAref(); //no warningcreateAptr(); //no warning
}

相关文章:

C++17 nodiscard标记符

文章目录前言弃值表达式nodiscard标记符函数非弃值声明类/枚举类/结构 非弃值声明返回类引用与类指针前言 在C 17中引入了一个标记符nodiscard&#xff0c;用于声明一个 “非弃值(no-discard)表达式”。那么在开始之前&#xff0c;我们需要了解一下什么是弃值表达式。 弃值表…...

SAP 寄售业务的标准流程

SAP的标准寄售业务&#xff0c;供应商提供的物料只有在公司使用之后才需支付应付账款&#xff0c;类似是一种先吃后付钱的餐饮流程。 SAP的寄售流程把实际业务中的供应商&#xff0c;采购方收货&#xff0c;采购方消耗物料&#xff0c;采购方依据消耗物料数量进行付款&#xff…...

操作系统高频知识

目录 一、线程与进程的区别 区别&#xff1a; 二、多进程和多线程区别 三、进程与程序的区别 三、死锁 1、是什么 2、产生的原因 3、产生的必要条件&#xff08;4个&#xff09; 4、如何预防 5、如何避免 6、如何检测 7、如何解除 一、线程与进程的区别 1、线程&a…...

加载预训练模型,模型微调,在自己的数据集上快速出效果

针对于某个任务&#xff0c;自己的训练数据不多&#xff0c;先找到一个同类的别人训练好的模型&#xff0c;把别人现成的训练好了的模型拿过来&#xff0c;换成自己的数据&#xff0c;调整一下参数&#xff0c;再训练一遍&#xff0c;这就是微调&#xff08;fine-tune&#xff…...

VScode远程连接服务器-过程试图写入的管道不存在-could not establist connection to【已解决】

问题描述 使用服务器的过程中突然与服务器断连&#xff0c;报错如下&#xff1a;could not establist connection to [20:23:39.487] > ssh: connect to host 10.201.0.131 port 22: Connection timed out > [20:23:39.495] > 过程试图写入的管道不存在。 > [20…...

电子技术——B类输出阶

电子技术——B类输出阶 下图展示了一个B类输出阶的原理图&#xff0c;B类输出阶由两个互补的BJT组成&#xff0c;不同时导通。 原理 当输入电压 vI0v_I 0vI​0 的时候&#xff0c;两个晶体管都截止输出电压为零。当 vIv_IvI​ 上升至超过0.5V的时候&#xff0c;此时 QNQ_NQN…...

【老卫搬砖】034期:HarmonyOS 3.1 Beta 1初体验,我在本地模拟器里面刷短视频

今天啊打开这个DevEco Studio的话&#xff0c;已经提示有3.1Beta1版本的一个更新啊。然后看一下它的一些特性。本文也演示了如何在本地模拟器里面运行HarmonyOS版短视频。 主要特性 新特性包括&#xff1a; Added support for Windows 11 64-bit and macOS 13.x OSs, as well…...

Day901.内部临时表 -MySQL实战

内部临时表 Hi&#xff0c;我是阿昌&#xff0c;今天学习记录的是关于内部临时表的内容。 sort buffer、内存临时表和 join buffer。这三个数据结构都是用来存放语句执行过程中的中间数据&#xff0c;以辅助 SQL 语句的执行的。 其中&#xff0c;在排序的时候用到了 sort bu…...

jstatd的启动方式与关闭方式

启动方式与注意事项&#xff1a; 启动方式&#xff1a; 前台启动不打印日志&#xff1a; jstatd -J-Djava.security.policyjstatd.all.policy -J-Djava.rmi.server.hostname服务器IP 前台启动并打印日志&#xff1a; ./jstatd -J-Djava.security.policyjstatd.all.policy -…...

_improve-3

createElement过程 React.createElement()&#xff1a; 根据指定的第一个参数创建一个React元素 React.createElement(type,[props],[...children] )第一个参数是必填&#xff0c;传入的是似HTML标签名称&#xff0c;eg: ul, li第二个参数是选填&#xff0c;表示的是属性&#…...

C++——异常

目录 C语言传统的处理错误的方式 C异常概念 异常的使用 异常的抛出和匹配原则 在函数调用链中异常栈展开匹配原则 自定义异常体系 异常的重新抛出 ​编辑 异常安全 异常规范 C标准库的异常体系 异常的优缺点 C语言传统的处理错误的方式 传统的错误处理机制&#xff1a; …...

MVVM 架构进阶:MVI 架构详解

前言Android开发发展到今天已经相当成熟了&#xff0c;各种架构大家也都耳熟能详&#xff0c;如MVC,MVP,MVVM等&#xff0c;其中MVVM更是被官方推荐&#xff0c;成为Android开发中的显学。不过软件开发中没有银弹&#xff0c;MVVM架构也不是尽善尽美的&#xff0c;在使用过程中…...

有没有必要考PMP证书?

其实针对有没有必要考试吗&#xff0c;这个可以根本不同行业的人来决定的。 1.高等教育项目管理专业科班出身的人员。 在我国本科学历和硕士研究生学历中&#xff0c;项目管理也有开设。不管以后从事的工作是否为项目管理或其他管理&#xff0c;作为本专业的同学&#xff0c;…...

1 机器学习基础

1 机器学习概述 1.1 数据驱动的问题求解 大数据-Big Data 大数据的多面性 1.2 数据分析 机器学习&#xff1a;海量的数据&#xff0c;获取有用的信息 专门研究计算机怎样模拟或实现人类的学习行为&#xff0c;以获取新的知识或技能&#xff0c;重新组织已有的知识结构使之…...

java基础系列(六) sleep()和wait() 区别

一.前言 关于并发编程这块, 线程的一些基础知识我们得搞明白, 本篇文章来说一下这两个方法的区别,对Android中的HandlerThread机制原理可以有更深的理解, HandlerThread源码理解,请查看笔者的这篇博客: HandlerThread源码理解_handlerthread 源码_broadview_java的博客-CSDN博…...

Urho3D序列化

从Serializable派生的类可以通过定义属性将其自动序列化为二进制或XML格式。属性存储到每个类的上下文中。场景加载/保存和网络复制都是通过从Serializable派生Node和Component类来实现的。 支持的属性类型是Variant支持的所有属性类型&#xff0c;不包括指针和自定义值。 属性…...

企业级信息系统开发学习1.3——利用注解配置取代Spring配置文件

文章目录一、利用注解配置类取代Spring配置文件&#xff08;一&#xff09;打开项目&#xff08;二&#xff09;创建新包&#xff08;三&#xff09;拷贝类与接口&#xff08;四&#xff09;创建注解配置类&#xff08;五&#xff09;创建测试类&#xff08;六&#xff09;运行…...

VUE DIFF算法之快速DIFF

VUE DIFF算法系列讲解 VUE 简单DIFF算法 VUE 双端DIFF算法 文章目录VUE DIFF算法系列讲解前言一、快速DIFF的代码实现二、实践练习1练习2总结前言 本节我们来写一下VUE3中新的DIFF算法-快速DIFF&#xff0c;顾名思义&#xff0c;也就是目前最快的DIFF算法&#xff08;在VUE中&…...

一文掌握如何轻松稿定项目风险管理【静说】

风险管理对于每个项目经理和PMO都非常重要&#xff0c;如果管理不当会出现很多问题&#xff0c;咱们以前分享过很多风险管理的内容&#xff1a; 风险无处不在&#xff0c;一旦发生&#xff0c;会对一个或多个项目目标产生积极或消极影响的确定事件或条件。那么接下来介绍下五大…...

操作系统权限提升(十四)之绕过UAC提权-基于白名单AutoElevate绕过UAC提权

系列文章 操作系统权限提升(十二)之绕过UAC提权-Windows UAC概述 操作系统权限提升(十三)之绕过UAC提权-MSF和CS绕过UAC提权 注&#xff1a;阅读本编文章前&#xff0c;请先阅读系列文章&#xff0c;以免造成看不懂的情况&#xff01;&#xff01; 基于白名单AutoElevate绕过…...

从栅格到矢量:基于ArcScan的河道中心线智能提取与精度优化实践

1. 从栅格到矢量的技术背景 河道中心线提取是水文分析中的基础性工作。传统人工勾绘方式效率低下&#xff0c;一条10公里长的河道可能需要耗费专业人员半天时间。而基于ArcScan的自动化提取方法&#xff0c;能将这个时间缩短到10分钟以内&#xff0c;同时保证亚米级精度。 我在…...

从混乱到秩序:如何用TrguiNG汉化版重塑你的Transmission下载管理体验

从混乱到秩序&#xff1a;如何用TrguiNG汉化版重塑你的Transmission下载管理体验 【免费下载链接】TrguiNG Transmission WebUI 基于 openscopeproject/TrguiNG 汉化和改进 项目地址: https://gitcode.com/gh_mirrors/tr/TrguiNG 你是否还在为Transmission简陋的原生Web…...

运动分析革命:如何用Kinovea将视频变成精准的教练和研究员

运动分析革命&#xff1a;如何用Kinovea将视频变成精准的教练和研究员 【免费下载链接】Kinovea Video solution for sport analysis. Capture, inspect, compare, annotate and measure technical performances. 项目地址: https://gitcode.com/gh_mirrors/ki/Kinovea …...

2026年搜索引擎大变革:生成式优化解决方案引领新潮流

引言随着ChatGPT、Google AI概览等工具成为主流搜索界面&#xff0c;传统的SEO策略已难以适配新时代的挑战。生成式引擎优化&#xff08;GEO&#xff09;应运而生&#xff0c;成为企业在线上生存与优化的新选择。本文将探讨2026年SEO行业格局的变化&#xff0c;分析GEO的核心逻…...

如何免费使用GanttProject:开源项目管理软件的完整入门指南

如何免费使用GanttProject&#xff1a;开源项目管理软件的完整入门指南 【免费下载链接】ganttproject Official GanttProject repository. 项目地址: https://gitcode.com/gh_mirrors/ga/ganttproject 你是否正在寻找一款功能强大且完全免费的项目管理工具&#xff1f;…...

从DP-V0到DP-V2:一文讲透Profibus-DP三大版本的核心差异与工业现场选型建议

从DP-V0到DP-V2&#xff1a;Profibus-DP三大版本的核心差异与工业现场选型指南 在工业自动化领域&#xff0c;实时通信协议的选型往往直接决定生产线的响应速度、诊断能力和系统扩展性。作为制造业自动化系统中应用最广泛的现场总线之一&#xff0c;Profibus-DP历经三次重大版本…...

Simulink Function子系统代码生成避坑指南:从Global配置到多输出端口的指针传递

Simulink Function子系统代码生成实战解析&#xff1a;从配置陷阱到高效集成 当你在Simulink中构建复杂算法时&#xff0c;是否遇到过这样的困境——生成的代码难以直接集成到现有系统中&#xff1f;传统的Simulink模型默认生成全局变量和void函数&#xff0c;这在需要精细控制…...

智能家居设备链故障诊断:从HDCP黑屏到系统化排查指南

1. 从一次“黑屏”故障说开去&#xff1a;智能家居时代的设备链诊断困境上周的一个晚上&#xff0c;我出门取外卖&#xff0c;为了让新来的小猫Mulligan自娱自乐&#xff0c;我特意把电视开着&#xff0c;让它继续玩Roku屏保里的虚拟水族箱。这算是它最喜欢的“游戏”之一。等我…...

长期使用Token Plan套餐,我的大模型调用成本降低了多少

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 长期使用Token Plan套餐&#xff0c;我的大模型调用成本降低了多少 1. 从按量付费到套餐订阅的转变 在深度使用大模型API进行项目…...

Realme Q3 5G刷Pixel Experience GSI保姆级教程(附问题修复与救砖指南)

Realme Q3 5G刷入Pixel Experience GSI全流程实战手册 在ColorOS与类原生Android之间&#xff0c;总有一群追求极简体验的玩家。Realme Q3 5G作为一款性价比突出的设备&#xff0c;其官方系统预装的应用和服务未必符合所有用户的期待。本文将带你完整走过从解锁到问题修复的全过…...