voidf(int); voidf(void*); f(0); // call f(int) f(NULL); // call f(int) if NULL is 0 ambigous otherwise f(nullptr); // call f(void*)
nullptr会被自动转换成各种pointer类型,但不会被转换成任何整数类型
1.2 以auto完成类型自动推导
auto类型推导
1 2 3 4 5 6
auto x = 5; // 正确,x是int类型 auto pi = newauto(1); // 正确,p是int* constauto* v = &x, u = 6; // 正确,v是const int*类型,u是const int staticauto y = 0.0; // 正确,y是double类型 autoint r; // 错误,auto不在表示存储类型的指示符 auto s; // 错误,auto无法推导出s的类型(必须马上初始化)
int x = 0; auto *a = &x; // a -> int*,a被推导为int* auto b = &x; // b -> int,b被推导为int,忽略了引用 auto &c = x; // c -> int&,c被推导为int& auto d = c; // d -> int,d被推导为int,忽略了引用 constauto e = x; // e -> const int auto f = e; // f -> int constauto& g = x; // g -> const int& auto& h = g; // h -> const int&
classP { public: P(int, int); explicitP(std::initalizer_list<int>); }; P p{77, 5}; // ok P q{77, 5}; // ok P r{77, 5, 42}; // ok P s = {77, 5, 42}; // error P s = {77, 5} // ok
int array[] = {1, 2, 3, 4, 5}; long sum = 0; for (int x : array) { sum += x; } for (auto elem : {sum, sum * 2, sum * 4} { std::cout << elem << std::endl; })
1.6 move语义和左值引用
###为何需要移动语义 假设有如下代码:
1 2 3 4
vector<string> vstr; // build up a vector of 20,000 strings, each of 1000 characters ... vector<string> vstr_copy1(vstr); // make vstr_copy1 a copy of vstr
vector<string> vstrl // build up a vector of 20,000 strings, each of 1000 characters vector<string> vstr_copy1(vstr); vector<string> vstr_copy2(allcaps(vstr));