[[nodiscard]] 为我们提供了一种去除无意间写出无用代码的方法;
使用示例如下:
#include <string>
#include <iostream>class ToolExample
{public:enum class ProcessResultState{Success = 0,Failure = 1};ProcessResultState processXX(){//process thingsreturn ProcessResultState::Success;}[[nodiscard]] std::string getName(){ return "Snoopy"; }};int main()
{std::cout << "nodiscard example" << std::endl;ToolExample tool_example;tool_example.processXX();tool_example.getName();}编译输出:
main.cpp: In function 'int main()':
main.cpp:35:23: warning: ignoring return value of 'std::string ToolExample::getName()', declared with attribute 'nodiscard' [-Wunused-result]35 | tool_example.getName();| ^
main.cpp:21:35: note: declared here21 | [[nodiscard]] std::string getName()| 执行结果:
nodiscard example
从示例中我们可以看出[[nodiscard]]用于修饰有返回值且在调用(或类别中的方法,这里统一使用函数来代表方法,函数,过程等)之后如果不接收返回值则函数调用失去意义的(除了占用CPU资源没有别的用处)的函数。nodiscard在这里的意义就是减少无用的调用。
对procesXX()调用来说,返回值可以接收也可以不接收,processXX()实现的是一个过程,这时不用[[nodiscard]]是必要的;
对getName()来说,他存在的唯一价值就是返回一个需要另一变量(或编译器生成的临时变量)来接收的返回值,这里如果省略[[nodiscard]]可能会导致无用的调用(一般是手误造成的)。
总结一下:
1. 对于只提供返回值的函数建议添加[[nodiscard]]修饰;
2. 对于可接收也可不接收返回值的函数一定要省略[[nodiscard]],否则要使用std::ignore或是void来忽略,这也是麻烦的。