C++ 11:user-defined literals(用户定义字面量)
user-defined literals(用户定义字面量)
通过定义用户定义的后缀,允许整数、浮点数、字符及字符串字面量产生用户定义类型的对象。
1-4) 用户定义整数字面量,例如 12_km
5-6) 用户定义浮点字面量,例如 0.5_Pa
7) 用户定义字符字面量,例如 ‘c’_X
8) 用户定义字符串字面量,例如 “abd”_L 或 u"xyz"_M
十进制字面量 - 与整数字面量中相同,非零的十进制数位后随零或多个十进制数位
八进制字面量 - 与整数字面量中相同,零后随零或多个八进制数位
十六进制字面量 - 与整数字面量中相同,0x 或 0X 后随一个或多个十六进制数位
二进制字面量 - 与整数字面量中相同,0b 或 0B 后随一或多个二进制数位
数字序列 - 与浮点字面量中相同,一个十进制数字序列
分数常量 - 与浮点字面量中相同,要么是一个后随小数点的 数字序列(123.),要么是一个可选的 数字序列 后随小数点和另一个 数字序列(1.0 或 .12)
指数部分 - 与浮点字面量中相同,字母 e 或字母 E 后随可选的正负号,后随 数字序列
字符字面量 ...
C++ 11:attributes(属性)
attributes(属性)
属性说明符序列(C++11 起)
为类型、对象、代码等引入由实现定义的属性。
[[属性]] [[属性1, 属性2, 属性3(实参)]] [[命名空间::属性(实参)]] alignas说明符
正式而言,语法是 [[ 属性列表 ]]
其中 属性列表 是由逗号分隔的零或更多个 属性 的序列(可以以指示包展开的省略号 … 结束)
标识符
属性命名空间 :: 标识符
标识符 (实参列表)
属性命名空间 :: 标识符 (实参列表)
简单属性,例如 [[noreturn]]
有命名空间的属性,例如 [[gnu::unused]]
有实参的属性,例如 [[deprecated("because")]]
既有命名空间又有实参列表的属性
属性为各种由实现定义的语言扩展(例如 GNU 与 IBM 的语言扩展 __attribute__((...)),微软的语言扩展 __declspec() 等)提供了统一化的语法。
属性可用在 C++ 程序中的几乎所有位置,而且可应用于几乎所有事物:类型、变量、函数、名字、代码块、整个翻译单元,不过每个特定的属性都只在 ...
C++ 11:unicode string literals(Unicode 字符串字面量)
Unicode 字符串字面量
语法
说明
“s字符序列(可选)”
通常字符串字面量。无前缀字符串字面量的类型是 const char[N],其中 N 是以执行窄编码 (C++23 前)通常字面量编码 (C++23 起)的编码单元计的字符串的大小,包含空终止符。
L"s字符序列(可选)"
宽字符串字面量。L"…" 字符串字面量的类型是 const wchar_t[N],其中 N 是以执行宽编码 (C++23 前)宽字面量编码 (C++23 起)的编码单元计的字符串的大小,包含空终止符。
u8"s字符序列(可选)"
UTF-8 字符串字面量。u8"…" 字符串字面量的类型是 const char[N] (C++20 前)const char8_t[N] (C++20 起),其中 N 是以 UTF-8 编码单元计的字符串的大小,包含空终止符。
u"s字符序列(可选)"
UTF-16 字符串字面量。u"…" 字符串字面量的类型是 const char ...
C++ 11:generalized PODs (trivial types and standard-layout types)(推广的 POD (平凡类型与标准布局类型))
推广的 POD
指定类型为 POD(Plain Old Data,简旧数据)类型。这表示该类型与用于 C 程序语言的类型兼容,即它能直接以二进制形式与 C 库交互。
注意:标准中并没有定义具有这个名字的具名要求。这是核心语言所定义的一种类型类别。将它作为具名要求包含于此只是为了保持一致性。
C++ 11:generalized (non-trivial) unions(推广的(非平凡)联合体)
联合体
联合体是特殊的类类型,它在一个时刻只能保有其一个非静态数据成员。
联合体声明的类说明符与类或结构体的声明相似:
union 属性 类头名 { 成员说明 }
名词
解释
属性
(C++11 起) 任意数量属性的可选序列
类头名
被定义的联合体的名字。可以前附 嵌套名说明符(名字与作用域解析运算符的序列,以作用域解析运算符结尾)。可以忽略名字,此时联合体是无名的
成员说明
访问说明符、成员对象和成员函数的声明与定义的列表。
联合体可以拥有成员函数(包含构造函数和析构函数),但不能有虚函数。
联合体不能有基类且不能用作基类。
联合体不能拥有引用类型的非静态数据成员。
联合体不能含有带非平凡特殊成员函数(复制构造函数、复制赋值运算符或析构函数)的非静态数据成员。(C++11 前)
如果联合体含有带非平凡特殊成员函数(复制/移动构造函数,复制/移动赋值,或析构函数)的非静态数据成员,那么该联合体中的那些函数默认被弃置,且需要程序员显式定义。
如果联合体含有带非平凡默认构造函数的非静态数据成员,那么该联合体的默认构造函数默认被弃置,除非该联合体的变体成员拥有一个 ...
C++ 11:variadic templates(可变参数模板)
形参包
模板形参包是接受零个或更多个模板实参(非类型、类型或模板)的模板形参。函数形参包是接受零个或更多个函数实参的函数形参。
至少有一个形参包的模板被称作变参模板。
变参类模板可以用任意数量的模板实参实例化:
1234567template<class... Types>struct Tuple {}; Tuple<> t0; // Types 不包含实参Tuple<int> t1; // Types 包含一个实参:intTuple<int, float> t2; // Types 包含两个实参:int 与 floatTuple<0> error; // 错误:0 不是类型
变参函数模板可以用任意数量的函数实参调用(模板实参通过模板实参推导推导):
123456template<class... Types>void f(Types... args); f(); // OK:args 不包含实参f(1); // OK:args ...
C++ 11:type aliases(类型别名)
type aliases(类型别名)
类型别名,别名模版 (C++11 起)
类型别名是指代【先前定义的类型】的名字(与 typedef 类似)。
别名模版是指代一族类型的名字。
语法
别名声明是具有下列语法的声明:
using 标识符 属性(可选) = 类型标识 ;
类型别名声明引入一个名字,可用做 类型标识 所指代的类型的同义词。它不引入新类型,且不能更改既存类型名的含义。类型别名声明和 typedef 声明之间没有区别。此类声明可出现于块作用域、类作用域或命名空间作用域。
template < 模板形参列表 >
using 标识符 属性(可选) = 类型标识 ;
别名模板是一种模板,当其特化时等价于以别名模板的模板实参来替换 类型标识 中的模板形参的结果。
12345template<class T>struct Alloc { };template<class T>using Vec = vector<T, Alloc<T>>; // 类型标识为 vector<T, Alloc ...
C++ 11:char16_t 与 char32_t(字符类型)
char16_t 与 char32_t(字符类型)
char16_t - UTF-16 字符表示的类型,要求大到足以表示任何 UTF-16 编码单元(16 位)。它与 std::uint_least16_t 具有相同的大小、符号性和对齐,但它是独立的类型。
char32_t - UTF-32 字符表示的类型,要求大到足以表示任何 UTF-32 编码单元(32 位)。它与 std::uint_least32_t 具有相同的大小、符号性和对齐,但它是独立的类型。
C++ 11:long long
整数类型
int - 基本整数类型。如果使用了下列任何修饰符就可以省略关键词 int。如果没有长度修饰符,那么它保证拥有至少 16 位宽度。然而在 32/64 位系统上,几乎专门保证它拥有至少 32 位宽度。
修饰符
修饰整数类型。能以任何顺序混合使用。类型名中每组只能有一个。
符号性
signed - 目标类型将拥有有符号表示(默认符号性)
unsigned - 目标类型将拥有无符号表示
大小
short - 目标类型将为空间优化,且将有至少 16 位的宽度。
long - 目标类型将有至少 32 位的宽度。
long long - 目标类型将有至少 64 位的宽度。(C++11 起)
注意:与所有类型说明符相同,容许采用任何顺序:unsigned long long int 与 long int unsigned long 指名同一类型。
C++ 11: 指针字面量(nullptr)
指针字面量(nullptr)
关键词 nullptr 代表指针字面量。它是 std::nullptr_t 类型的纯右值。存在从 nullptr 到任何指针类型及任何成员指针类型的隐式转换。同样的转换对于任何空指针常量也存在,空指针常量包括 std::nullptr_t 的值,以及宏 NULL。
123456789101112131415161718192021222324#include <cstddef>#include <iostream> template<class T>constexpr T clone(const T& t){ return t;} void g(int*){ std::cout << "函数 g 已调用\n";} int main(){ g(nullptr); // 良好 g(NULL); // 良好 g(0); // 良好 g(clo ...