c++11特性学习总结
ubuntu 16.04 自带gcc 5.4 支持c++11
ubuntu 18.04 自带gcc 7.3 支持c++14
查看编译器支持:
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