ubuntu 16.04 自带gcc 5.4 支持c++11

ubuntu 18.04 自带gcc 7.3 支持c++14
查看编译器支持:

c++11
c++14
c++17

c++11 feature

  • nullptr/constexpr
  • enum class
  • auto/decltype
  • for iteration
  • initialize_list
  • lamda
  • template
  • rvalue/move

nullptr

以前的编译器实现,可能会把NULL定义为0.所以,当你有两个同名函数foo(int),foo(char*)时,foo(NULL)你的本意可能是调用后者,但实际调用的是前者.nullptr的引入就是为了解决这个问题.

void foo(char *ch) {     std::cout << "call foo(char*)" << std::endl; } void foo(int i) {     std::cout << "call foo(int)" << std::endl; }  void test_nullptr() {     if (NULL == (void *)0)         std::cout << "NULL == 0" << std::endl;     else         std::cout << "NULL != 0" << std::endl;     foo(0);     //foo(NULL); // 编译无法通过     foo(nullptr); } 

constexpr

常量表达式的引入是为了提高性能,将运行期间的行为放到编译期间去完成.如下代码

constexpr long int fib(int n)  {      return (n <= 1)? n : fib(n-1) + fib(n-2);  }  void test_constexpr() {     auto start = std::chrono::system_clock::now();     const long int res = fib(30);     auto end = std::chrono::system_clock::now();     std::chrono::duration<double> elapsed_seconds = end-start;     cout << "elapsed_seconds:"<<elapsed_seconds.count()<<endl;        start = std::chrono::system_clock::now();     long int res2 = fib(30);     end = std::chrono::system_clock::now();     elapsed_seconds = end-start;     cout << "elapsed_seconds:"<<elapsed_seconds.count()<<endl;  

由于传给fib(int n)的参数是30,是个固定的值.所以可以在编译期间就求出来.当我们用const long和long声明返回值时,对前者会在编译期就做计算优化.如下图,可以看到二者运行时间有数量级上的差异.  

enum class

c++11中把枚举认为是一个类,以前的标准中枚举值就是一个整数而已.看如下代码

void test_enum() {     enum color {black,white};     //auto white = true; //redeclared