返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C++17中nodiscard标记符如何使用
  • 365
分享到

C++17中nodiscard标记符如何使用

2023-07-05 06:07:44 365人浏览 薄情痞子
摘要

这篇文章主要介绍“c++17中nodiscard标记符如何使用”,在日常操作中,相信很多人在C++17中nodiscard标记符如何使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C++17中nodisca

这篇文章主要介绍“c++17中nodiscard标记符如何使用”,在日常操作中,相信很多人在C++17中nodiscard标记符如何使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C++17中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标记符。它一般用于标记函数的返回值或者某个类。声明语法为:

[[nodiscard]] return_type function();[[nodiscard("message")]] return_type  function();_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++17    func2();                         //warning c++20    int a = func1();                 //no warning    static_cast<void>(func1());      //no warning}

结果如下:

C++17中nodiscard标记符如何使用

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

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();}

输出如下:

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 here
   10 | A createA(){
      |   ^~~~~~~
6.cpp:6:21: note: 'A' declared here
    6 | 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 here
   14 | B createB(){
      |   ^~~~~~~
6.cpp:7:26: note: 'B' declared here
    7 | 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 here
   18 | C createC(){
      |   ^~~~~~~
6.cpp:8:22: note: 'C' declared here
    8 | 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 warning    createAptr(); //no warning}

到此,关于“C++17中nodiscard标记符如何使用”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

--结束END--

本文标题: C++17中nodiscard标记符如何使用

本文链接: https://lsjlt.com/news/350202.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • C++17中nodiscard标记符如何使用
    这篇文章主要介绍“C++17中nodiscard标记符如何使用”,在日常操作中,相信很多人在C++17中nodiscard标记符如何使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C++17中nodisca...
    99+
    2023-07-05
  • 详解C++17中nodiscard标记符的使用
    目录前言弃值表达式nodiscard标记符函数非弃值声明类/枚举类/结构 非弃值声明返回类引用与类指针前言 在C++ 17中引入了一个标记符nodiscard,用于声明一个 &ldq...
    99+
    2023-02-27
    C++17 nodiscard标记符 C++17 nodiscard C++ nodiscard
  • c++如何使用调试标记
    这篇文章给大家分享的是有关c++如何使用调试标记的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。使用调试标记在调试程序的时候使用相应的辅助代码(如输出中间结果等),在调试完成之后隐...
    99+
    2024-04-02
  • JSP中自定义标记符的使用 (转)
    JSP中自定义标记符的使用 (转)[@more@]JSP中自定义标记符的使用  摘要   在JSP中有一种机制,可以让你在JSP页面中插入与HTML类似的标记。本文介绍JSP定制标记的基本概念和构成,以及如何开发和应用JSP定制标...
    99+
    2023-06-03
  • C#标识符怎么使用
    本篇内容介绍了“C#标识符怎么使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!C#标识符中的用法在 C#  规范中, @&nbs...
    99+
    2023-06-17
  • C# 中sealed修饰符如何使用
    这篇文章将为大家详细讲解有关C# 中sealed修饰符如何使用,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。C# sealed修饰符是干什么的?C# sealed修饰符表示密封用于类时,表示...
    99+
    2023-06-17
  • C#中New运算符如何使用
    本篇文章给大家分享的是有关C#中New运算符如何使用,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。C# New运算符用于创建对象和调用构造函数例:Class_Test MyCl...
    99+
    2023-06-18
  • c语言中如何定义标识符
    c 语言中标识符用于标识变量、函数等实体,必须遵循以下规则:由字母、数字和下划线组成;不能以数字开头;不能是保留字;没有长度限制;区分大小写。标识符用于:变量名:存储数据;函数名:定义函...
    99+
    2024-05-22
    c语言
  • PHP如何标记分割字符串
    这篇文章将为大家详细讲解有关PHP如何标记分割字符串,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。如何使用 PHP 标记分割字符串 前言 字符串分割是将字符串分解为更小部分的过程,称为标记。PHP 提供了...
    99+
    2024-04-02
  • C#中如何使用别名指示符
    这篇文章将为大家详细讲解有关C#中如何使用别名指示符,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。C#别名指示符是什么?通过C#别名指示符我们可以为某个类型起一个别名,主要用于解决两个命名空...
    99+
    2023-06-17
  • C#中如何使用三元操作符
    C#中如何使用三元操作符,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。C# 操作符之三元操作符“:”是什么呢?C# 操作符之三元操作符“:”有时也称为条件操作符...
    99+
    2023-06-18
  • C++中如何使用地址运算符
    C++中如何使用地址运算符,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。在C++中,&这个C++地址运算符有两个含义,一种含义是取某个变量或者对象的地址。这个地址是...
    99+
    2023-06-17
  • C++中如何使用访问控制符
    本篇文章为大家展示了C++中如何使用访问控制符,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。一、简单可以归为以下两种描述:1)一个类友元(包含友元函数或者友元类的成员函数或者友元类的所有成员函数)可...
    99+
    2023-06-17
  • C++中如何使用逗号操作符
    C++中如何使用逗号操作符,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。其实,我们是经常会用到逗号操作符的,但是并不是所有代码里出现的逗号都是逗号操作符。让我们先从一个类的示例...
    99+
    2023-06-17
  • C++中null找不到标识符如何解决
    在C++中,`null`不是一个标识符。相反,C++使用`nullptr`来表示空指针。要解决“null找不到标识符”的问题,您可以...
    99+
    2023-09-26
    C++
  • PHP如何从字符串中删除 HTML和PHP标记
    这篇文章将为大家详细讲解有关PHP如何从字符串中删除 HTML和PHP标记,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。从字符串中删除 HTML 和 PHP 标记 引言: 在数据处理中,经常需要从字符串中...
    99+
    2024-04-02
  • C语言如何命名标识符
    今天小编给大家分享一下C语言如何命名标识符的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。1、标识符的命名要清晰、明了,有明确...
    99+
    2023-06-16
  • c#转义字符如何使用
    在C#中,转义字符以反斜杠(\)开头,后面跟着一个特定的字符,用来表示一些特殊的字符或者控制字符。以下是一些常用的转义字符示例: ...
    99+
    2024-04-02
  • C#使用GUID(全局统一标识符)
    一、简介 1.什么是GUID? 全局唯一标识符(GUID,Globally Unique Identifier),GUID也称作 UUID(Universally Unique ID...
    99+
    2024-04-02
  • 如何合理运用HTML标题标记和强调标记
    如何合理运用HTML标题标记和强调标记,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。搜索引擎是通过分析网页源代码来分析页面文本信息的逻辑性,所以在编写网页代码的...
    99+
    2023-06-13
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作