1:nullptr和std::nullptr_t
c++允许你使用nullptr取代0或NULL,用来表示一个pointer(指针)指向所谓的 no value(此不同于拥有1个不去定值),这个新特性特别能帮助你在“null pointer”被解释为一个整数值是避免误解。例如:
void f(int);
void f (void*);
f(0);
f(NULL);
f(nullptr);
nullptr是个新的关键字.它被自动转换为各种pointer类型,但不会转换为任何整数类型.他拥有类型std::nullptr_t,定义与<cstddef>,所以你现在甚至可以重载函数令他们接受null poniter。主要,std::nullptr_t被视为一个基础类型。
2:以auto完成类型自动推导
c++11允许你声明一个变量或对象而不需要指明其类型,只需说他是auto。例如:
auto i = 42;
double f();
以auto声明的变量,其类型会根据其初值被自动推导出来,因此一定需要一个初始化操作:
auo i; //ERROR :can't deduce the type of i
可为它加上额外的限定符,例如:
static auto vat = 0.19;
如果类型很长或者表达式很复杂,auot特别有用,例如:
vector<string> v;
auto pos = v.begin();
auto l = [] (int x) -> boll{.....};
3:一致性初始化与初值列
c++引入了“一致性初始化”概念,意思是面对任何初始化动作,你可以使用相同语法,也就是使用大括号。例如:
int values[] {1,2,3};
std::vector<int> v {2,3,4,5,6,7};
std::vector<std::string> cities{"Bejing","HongKong","JiangXi"};
std::complex<double> c{4.2,4.6};
初值列会强迫造成所谓的value initialization,意思是即使某个local变量属于某种基础类型(那通常会有不明确的初值)也会被初始化为0(或nullptr--如果它是个pointer的话)
int i; // i has undefined value
int j{}; // j is initialized by 0
int* p; // p has undefined value
int* q{}; // qis initialized by nullptr
然而请注意,窄化--也就是精确度降低或造成数值变动--对大括号而言是不可成立的。例如
int x1(5.3); //OK,but OUCH:x1 becomes 5
int x2=5.3; //OK,but OUCH:x2 becomes 5
int x3{5.9} //ERROR:narrowing
int x4 = {5.3} //ERROR:narrowing
char c1{7}; //OK:even though 7 is an int ,this is not narrowing
char c2{99999}; //ERROR:narrowing (if 99999 doesn't fit into a char)
std::vector<int> v1 {1,2,3,4} //OK
std::vector<int> v2 {1,2.3,4,5,7.7} //ERROR:narrowing double to ints
4:Range-Based for循环
c++11引入了一种崭新的for循环,可以逐一迭代某个给定的区间,数组,集合内的每一个元素,其一般性语法如下:
for(decl : coll){
statement
}
其中decl是给定之coll集合中的每个元素的声明,针对这些元素,给定的statement会被执行,例如下面针对传入的初值列中的每个元素:
for(int i:{2,3,4,5,6,7,78}){
std::cout << i << std::endl;
}
5:Move语义和Rvalue Reference
c++11的一个最重要的特性就是,支持move semantic(搬迁语义)。这项特性更进一步进入了c++主要涉及目标内,用以避免非必要拷贝和临时对象
6:关键字noexcept
c++11提供了关键字noexcept,用来指明某个函数无法--或不打算--跑出异常。例如
void foo () noexcept;
7:关键字constexpr
自c++11起,constexpr可以来让表达式核定于编译期,例如:
constexpr int suqare(int x)
{
return x*x;
}
8:lambda表达式
9:decltype
新关键字可以染编译器赵成表达式类型