最简C++11笔记
Move语义
避免复制开销,转移指针的所有权。
右值引用
右值引用通过
A&&
创建,实现move语义和理想的参数传递。变长模板
可以传入0到多个模板参数:
template <typename... T> struct arity { constexpr static int value = sizeof...(T); }; static_assert(arity<>::value == 0); static_assert(arity<char, short, int>::value == 3);
初始化列表
比如
auto list = { 1, 2, 3 };
创建的类型是std::initializer_list<int>
,可以用来替代一个对象的vector传给函数。静态断言
编译期评估的断言。
auto
根据初始化器的自动类型推断,大大增加了可读性。
lambda表达式
- [] : 不捕获
- [=] : 按值捕获局部对象
- [&] : 按引用捕获局部对象
- [this] : 通过值捕获
this
指针 - [a, &b] : 通过值捕获
a
, 通过引用捕获b
decltype
返回表达式的声明类型。
模板别名
使用
using
代替typedef
。nullptr
标准化的空指针定义,替代C语言的
NULL
宏,类型为std::nullptr_t
。可以转换为指针类型,但不能转为整数。强类型枚举
类型安全的枚举:
// Specifying underlying type as `unsigned int` enum class Color : unsigned int { Red = 0xff0000, Green = 0xff00, Blue = 0xff }; // `Red`/`Green` in `Alert` don't conflict with `Color` enum class Alert : bool { Red, Green }; Color c = Color::Red;
属性
标准的属性定义方式。
// `noreturn` attribute indicates `f` doesn't return. [[ noreturn ]] void f() { throw "error"; }
constexpr
编译期可评估的表达式,运算一般不复杂。
代理构造函数
构造函数可以调用其他构造函数了。
自定义字面量
通过
T operator "" X(...) { ... }
的形式定义,返回T类型,名称为X。显式虚继承
语义同Java中的
override
关键字。Final限定词
语义同Java中的final,禁止其他类型扩展。
默认函数
优雅高效的定义函数的默认实现。
删除函数
优雅高效的定义函数的禁用实现。如:
A(const A&) = delete;
基于range的循环
类似Java循环的语法糖:
for (int& x : a) x *= 2;
实现move语义的特殊成员函数
在C++11里,可以定义move构造器和move赋值函数。
转换构造器
允许将括号()或{} 包含的列表转换为参数。
显式转换函数
使用
explicit
限定词。内联命名空间
内联命名空间被认为是父母空间的一部分。
非静态数据成员的初始化器
如
unsigned age{0};
。右尖括号
C++11允许连续的右尖括号,无需空格分隔。