所以像 { 10, 20, 30 } 这种用大括号括起来的列表就是初始化列表。
在 C++11 中,支持了用列表初始化来构造容器,因此我们都可以用 “{ }” 来进行初始化容器。
vector v = {1, 2, 3, 4, 5, 6};
auto 只能根据变量初始化表达式类型推导变量类型,换句话说,auto 使用的前提是必须要对 auto 类型的变量进行初始化,否则编译器无法推导出 auto 的类型。
auto i = 1; // 不报错
auto i; // 报错
decltype 可以理解成是不用对变量进行初始化版的 auto。
// 推演表达式类型
int a = 10, b = 20;
decltype(a + b) c; // c 的实际类型为 int
// 推演函数返回值的类型
cout << typeid(decltype(GetMemory())).name() << endl;
C++11 支持强制生成默认成员函数(构造函数、拷贝构造函数、析构函数、赋值重载函数、取地址符重载函数,const取地址重载函数)。如果我们想强制编译器生成默认成员函数,只需要在函数的参数列表后面加上 =default 修饰就可以了。
class A
{
public:
A(int a)
:_a(a)
{}
A() = default; // 强制编译器生成构造函数
private:
int _a;
};
同时,如果我们不想让编译器生成默认成员函数,只要在函数的参数列表后面加上 =delete 修饰就行了。
class A
{
~A() = delete; // 禁止编译器生成析构函数
A& operator=(const A& a) = delete; // 禁止编译器生成赋值重载函数
};