@@ -36,6 +36,16 @@ date: 2024-10-01
3636- [ static\_ assert声明] ( #static_assert声明 )
3737- [ 结构化绑定(C++17 C++20)] ( #结构化绑定c17-c20 )
3838- [ noexcept关键字(C++11 C++17 C++20)] ( #noexcept关键字c11-c17-c20 )
39+ - [ 类型别名和别名模板(C++11 C++14)] ( #类型别名和别名模板c11-c14 )
40+ - [ 指针字面量nullptr(C++11)] ( #指针字面量nullptrc11 )
41+ - [ 三向比较(C++20)] ( #三向比较c20 )
42+ - [ 线程局部存储(C++11)] ( #线程局部存储c11 )
43+ - [ 扩展的inline说明符(C++17)] ( #扩展的inline说明符c17 )
44+ - [ 常量表达式(C++11~C++20)] ( #常量表达式c11c20 )
45+ - [ 确定的表达式求值顺序(C++17)] ( #确定的表达式求值顺序c17 )
46+ - [ 字面量优化(C++11~C++17)] ( #字面量优化c11c17 )
47+ - [ alignas和alignof(C++11 C++17)] ( #alignas和alignofc11-c17 )
48+ - [ 属性说明符和标准属性(C++11~C++20)] ( #属性说明符和标准属性c11c20 )
3949
4050## 新基础类型(C++11~C++20)
4151
@@ -521,3 +531,29 @@ alignas接受类型或常量表达式,其计算结果必须是一个2的幂值
521531` std::align ` 可以返回一个缓冲区中最近的符合指定对齐字节长度的指针。
522532
523533C++17中new运算发也拥有了根据对齐字节长度分配对象的能力。这并不需要额外的代码介入。
534+
535+ ## 属性说明符和标准属性(C++11~C++20)
536+
537+ GCC的属性语法:` _attribute__((attribute-list)) ` ,它可以用于结构体、类、联合类型、枚举类型、变量或者函数。
538+
539+ MSVC属性语法为` __declspec(attribute-list) ` 。
540+
541+ C++11引入了标准的属性说明符:` [[attr]] ` 。普遍的规则是,属性说明符总是声明位于其之前的对象,而在整个声明之前的属性则会声明语句中所有声明的对象。
542+
543+ 属性说明符包含命名空间,C++17允许使用using关键字在属性说明符中打开命名空间以简化代码:` [[ using attribute-namespace : attribute-list ]] ` ,另外,C++17规定编译器应该忽略任何无法识别的属性。
544+
545+ ` [[noreturn]] ` 声明函数不会返回。
546+
547+ ` [[carries_dependency]] ` 声明允许跨函数传递内存依赖项。
548+
549+ ` [[deprecated("str")]] ` C++14引入,被使用时编译器会报警。
550+
551+ ` [[fallthrough]] ` C++17对switch报警的规避。
552+
553+ ` [[nodiscard]] ` C++17引入函数返回值不应该被舍弃,可以用在类和枚举类型上,当函数返回值为该类型时有效,对引用无效。C++20允许添加一个字符串。
554+
555+ ` [[maybe_unused]] ` C++17引入说明实体可能不会被使用。
556+
557+ ` [[likely]] ` 和` [[unlikely]] ` C++20引入用于说明该属性的执行路径是否需要进行优化。
558+
559+ ` [[no_unique]] ` 用于说明数据成员不需要与其他非静态成员使用不同的地址。可以节省无状态的类的内存空间。
0 commit comments