虽然这些特性估计八辈子是用不上了,不过还是记录一下:
c++11开始定义标准attribute,用以控制编译器的某些行为;此前用于这个目的的有**#pragma**,attribute,__declspec等
截至到目前的c++17标准,定义的并不多,如下:
标识符 | 用途 |
---|---|
[[noreturn]] | 有此标识的函数声明表明该函数不返回(如果有返回,UD) |
[[carries_dependency]] | 与多线程下内存优化有关 |
[[deprecated(“reason”)]] | 有此标识的标识符在被使用时发出编译器警告,但可以照常使用 |
[[fallthrough]] | 有此标识的switch语句的case段在执行后没有跳过之后的case段,编译器不会发出警告 |
[[nodiscard]] | 有此标识的函数或者返回有此标识的枚举、类对象的函数在返回值被丢弃时,编译器发出警告 |
[[maybe_unused]] | 有此标识的标识符未被使用,编译器不会警告 |
根据这篇博客,这些attribute可以用于控制编译器的警告,规避潜在的问题。比如[[nodiscard]]就适用于有bool返回值标识函数运行成功与否的情况。在这种情况下,调用者如果没有用if检查返回值,编译器会发出警告(当然,使用者可以用很简单的hack来规避警告,不过这种刻意的行为毫无意义)