空格
vector<list<list> >; // C++11之前需要一个空格 vector<list<list>>; // OK 在C++11之后
nullptr和std::nullptr_t
// 空指针可以设置成 nullptr void f(int); void f(void*); f(0); // call f(int) f(NULL); // call f(int) if NULL == 0 f(nullptr); // call f(void*) typedef decltype(nullptr) nullptr_t; // 所以nullptr_t就是nullptr的类型
decltype
// 用于定义变量而不必关注类型 int i; decltype(i) a;
类型自动推导
auto a = {1,2}; // a是一个int类型,用于模板和lambda函数的返回值等复杂类型的情况
变量初始化的 标准化,全部都可以用大括号初始化变量,幕后是array结构在支撑
int val[] {1, 2, 3}; vector<int> vec{1, 2, 3}; vector<string> cites{"a", "a", "a", "a", "a", "a"};
initializer lists (值得重看)
int i; // i有未定义的值 int j{}; // j 初始化成0 int* p; // p有未定义的值 int* q{}; // q被初始化成nullptr int x1(5.1); // OK,但是x1会是5 int x2 = 5.3; // OK,但是x2会是5 int x3{5.3}; // ERROR,强制转换失败 int x4 = {5.3}; // ERROR,强制转换失败 class P { P(int a, int b) { cout << a << b << endl; } P(initializer_list<int> il) { for (auto &i :il) cout << i << " "; cout << endl; } } P p(3, 5); // 调用P(int a, int b) P p{3, 5};// 调用P(initializer_list il),但是没有这个函数的时候就调用另一个构造函数了 P p{1, 3, 6}; // 调用P(initializer_list il) int a = min{1, 3, 5}; // 原来的min版本只能求2个元素的最小值,现在可以求不限个数了