中山手机网站建设电话,工控机软件开发工具,代做百度关键词排名,怎么做自己的网站赚钱文章目录前言弃值表达式nodiscard标记符函数非弃值声明类/枚举类/结构 非弃值声明返回类引用与类指针前言
在C 17中引入了一个标记符nodiscard#xff0c;用于声明一个 “非弃值(no-discard)表达式”。那么在开始之前#xff0c;我们需要了解一下什么是弃值表达式。
弃值表…
文章目录前言弃值表达式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 C17 */
[[nodiscard]] return_type function();
/* since C20 */
[[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_castvoid将其转化为void时编译器会抛出warning来提醒用户获取返回值。
函数非弃值声明
[[nodiscard]] int func1(){return 1;
}[[nodiscard(nodiscared function)]] int func2(){return 1;
}int main(){func1(); //warning C17func2(); //warning c20int a func1(); //no warningstatic_castvoid(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
}