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