attribute 新增_C++20 新特性(22):C++ attribute的改进

C++ attribute 简介C++ 的 attribute 是一种标准的语法结构来对语言进行扩展,用来统一各种编译器的自定义扩展,例如 gcc 的 __attribute__((...)) ,或者微软的 __declspec() 。C++ 语言本身定义了一些标准的 attribute ,例如 [[ noreturn ]] 、 [[ nodiscard ]] 等,也支持编译器特定的 attrib...
摘要由CSDN通过智能技术生成

C++ attribute 简介

C++ 的 attribute 是一种标准的语法结构来对语言进行扩展,用来统一各种编译器的自定义扩展,例如 gcc 的 __attribute__((...)) ,或者微软的 __declspec() 。

C++ 语言本身定义了一些标准的 attribute ,例如 [[ noreturn ]] 、 [[ nodiscard ]] 等,也支持编译器特定的 attribute ,例如 [[ gnu::unused ]] 等,

c2a58a76c59e6e2647bdf6f184a07e1d.png

C++20 对 [[ nodiscard ]] 的改进

在 C++17 中引入了 [[ nodiscard ]] 属性,主要是用来标记一个对象或者一个函数,通知编译器这个对象或者这个函数返回的对象不应该被丢弃,如果被丢弃了,编译器应该发出警告。

C++20 在 C++17 的基础上,对 [[ nodiscard ]] 属性进行了改进:

  1. 支持 [[ nodiscard ]] 属性增加参数,用于说明理由
  2. 对于构造函数也标记 [[ nodiscard ]] 属性

下面通过一些例子来说明 [[ nodiscard ]] 属性:

#include using std::cout, std::endl;// <1> 类本身是 nodiscard ,函数返回这个类的对象时不可丢弃struct [[ nodiscard("for example, maybe memory leak") ]] SA{    int m_a;};struct SC{    SC() : m_b( 7 ) {}  // <2> 普通构造函数    [[ nodiscard ]] SC( int fd, int b ) : m_b ( b ) {}  // <3> 特定的构造函数,构建的对象不可丢弃    int m_b;};// <21> 函数返回的对象不可丢弃struct SA func_1(){    return SA { 5 };}// <22> 返回的是对象的引用,而不是对象,不同的类型,因此不算不可丢弃struct SA & func_2(){    static SA a1 { 5 };    return a1;}// <23> 函数本身有nodiscard标记,不管返回什么对象都不可丢弃[[ nodiscard ]] struct SC func_3(){    return SC();}// <24> 普通函数,SC类也只是某些构造函数不可丢弃,不是整个类本身不可丢弃,
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值