C++11
空格
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个元素的最小值,现在可以求不限个数了