c++ [[nodiscard]]关键字详解

如果一个函数声明了[[nodiscard]],则该函数的返回值不能没有承接,如果没有承接,就会编译报warning

[[nodiscard]]是c++17新特性,但本地用c++11标准编译也能编译过,尚不清楚原因,c++20加入了warning后的额外文字描述功能

测试代码

struct [[nodiscard]] error_info { /*...*/ };
error_info enable_missile_safety_mode() { /*...*/ return {}; }
void launch_missiles() { /*...*/ }
void test_missiles()
{
    enable_missile_safety_mode(); // compiler may warn on discarding a nodiscard value
    launch_missiles();
}
error_info& foo() { static error_info e; /*...*/ return e; }
void f1() { foo(); } // nodiscard type is not returned by value, no warning
// nodiscard( string-literal ) (since C++20):
[[nodiscard("PURE FUN")]] int strategic_value(int x, int y) { return x ^ y; }

int main()
{
    strategic_value(4, 2); // compiler may warn on discarding a nodiscard value
    auto z = strategic_value(0, 0); // ok: return value is not discarded
    return z;
}

一个疑问:
为什么nodiscard属性不是默认值,似乎返回值没有被利用就是一个bug才对

解答:
因为考虑向后兼容,如果改为默认的话,那之前编写的代码将会发出警告,虽然可以编译成功,但这将是个重大的语义变化,新语言使用这个特性作为默认是有道理的,因为不用考虑兼容问题,如Nim语言

nodiscard使用场景:

  • 如果一个函数除了返回某个结果之外没有其他作用,即是纯的。如果不使用结果,则调用肯定是无用的
  • 如果一个返回值必须被检查,比如返回错误码

nodiscard函数在.cc文件定义时可以不写[[nodiscard]]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值