本文讨论了10个C++11中新增的特性,所有的C++开发者都应学习和使用。C++11无论是语言本身还是标准库都新增了许多新的东西,而本文仅仅是介绍了皮毛。但我认为其中的部分新特性应该被应用到开发者的日常开发中。已有许多文章介绍了C++11与之前版本的不同之处,下面我将尝试列出当前应作为准则的那些C++的特性。
  内容索引:
  自动类型(auto)
  空指针(nullptr)
  集合循环(Range-based for loops)
  override和final标识(override and final)
  强类型的枚举类型(Strongly-typed enums)
  智能指针(Smart pointers)
  Lambdas表达式(Lambdas)
  非成员的begin()和end()函数(non-member begin() and end())
  静态断言和类型特性(static_assert and type traits)
  移动语义(Move semantics)
  自动类型
  在C++11之前auto关键字用于标识自动存储的临时变量,而在新标准中auto用于类型推断。auto现在是一种类型占位符,告诉编译器需要从变量的初始定义中推断出该变量的实际类型。它可用于不同域中变量的定义,如命名空间、块、for循环中的初始化语句等。
  1 auto i = 42;        // i is an int
  2 auto l = 42LL;      // l is an long long
  3 auto p = new foo(); // p is a foo*
  Using auto usually means less code (unless your type is int which is one letter shorter). Think of iterators in STL that you always had to write while iterating over containers. It makes obsolete creating typedefs just for the sake of simplicity.
  使用auto可以减少代码长度(int除外,它比auto还少一个字符),想一想STL中每次需要遍历容器时你不得不写一遍的迭代器知道auto有多好用了。它使得创建typedef来精简代码成为了过时的技术。
  1 std::map<std::string, std::vector<int>> map;
  2 for(auto it = begin(map); it != end(map); ++it)
  3 {
  4 }
  或许你已注意到了auto不能作为函数的返回类型。但是在函数尾标注了函数的返回类型时,可以在写函数返回值类型的地方使用auto(但这样用没什么意义,应该是作为到C++14的过渡吧)。这种情况下auto并没有让编译器去推断返回类型,而只是告诉它到函数尾去查看返回类型。在下面的例子中,函数compose的返回类型是表达式(t1+t2)的返回类型。
  1 template <typename T1, typename T2>
  2 auto compose(T1 t1, T2 t2) -> decltype(t1 + t2)
  3 {
  4     return t1+t2;
  5 }
  6 auto v = compose(2, 3.14);  // v's type is double
  空指针
  C98中空指针的值为0,由于隐式转换为整型带来了很多弊端。而关键字nullptr提供了一个std::nullptr_tr类型的值专门来表示空指针的含义。隐式转换可以发生在从nullptr到任何指针类型的空指针值或任何成员指针类型的空指针值,也可以转换为bool类型(作为false),但不会发生隐式转换为整型的情况。
1 void foo(int* p) {}
2
3 void bar(std::shared_ptr<int> p) {}
4
5 int* p1 = NULL;
6 int* p2 = nullptr;
7 if(p1 == p2)
8 {
9 }
10
11 foo(nullptr);
12 bar(nullptr);
13
14 bool f = nullptr;
15 int i = nullptr;    // error: A native nullptr can only converted to bool or, using reinterpret_cast, to an integral type
  为了向后兼容,0仍然可以作为空指针的值。