c++ [[nodiscard]] 使用

[[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来忽略,这也是麻烦的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值