Skip to content

Commit 97ea8a5

Browse files
committed
add note of chapter31
1 parent bb216e1 commit 97ea8a5

File tree

1 file changed

+36
-0
lines changed

1 file changed

+36
-0
lines changed

_posts/2024-10-01-现代C++语言核心特性解析.md

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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

523533
C++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

Comments
 (0)