c++17新特性有:1、对auto表达式推导的规则进行了改变;2、lambda表达式可以捕获“*this”;3、新增inline变量,可以直接将全局变量定义在头文件中;4、条件表达式中支持初始化语句;5、枚举的直接列表初始化等等。
本教程操作环境:windows7系统、C++17版本、Dell G3电脑。
相关推荐:《C++视频教程》
C++17中的新特性
1. auto关键字
从c++11开始,auto关键字能够通过初始化器推导出变量的类型。在c++14中,auto关键字的能力进一步提升,能够通过return语句推导出函数的返回类型。 使用auto关键字能够提高编码效率,同时能够简化重构流程。但是,C++11中的auto推导,往往结果与预期的不同。
c++11 中为了支持统一初始化,引入了新的统一初始化语法,如下所示。
// c++11 auto x3{ 1, 2 }; // std::initializer_list<int> auto x4 = { 3 }; // decltype(x4) is std::initializer_list<int> auto x5{ 3 }; // std::initializer_list<int>
这三种方式初始化的变量,最终类型推导的结果都是 std::initializer_list , 而不是我们认为的int。 这是因为 当用于auto声明变量的表达式是{}括起来的,推导的型别就会变成 std::initializer_list。
在C++17中,对auto表达式推导的规则进行了改变
// c++17 auto x3{ 1, 2 }; // error: not a single element auto x4 = { 3 }; // decltype(x4) is std::initializer_list<int> auto x5{ 3 }; // decltype(x5) is int
对比发现, auto x5{3}, 会直接将变量推导成 x5, 而 x3{1, 2} 这种方式也会编译失败。auto推导的规则变得更加直观。
2. lambda表达式
lambda也是c++11中引入的,在C++11中,lambda表达式只能用捕获this,this是当前对象的一个只读的引用。 在C++17中,可以捕获*this, *this是当前对象的一个拷贝,捕获当前对象的拷贝,能够确保当前对象释放后, lambda表达式能安全的调用this中的变量和方法。
3. inline变量
Inline 变量, inline变量可以让变量有多于一次的定义。C++17之前,我们定义全局变量, 总需要将变量定义在cpp文件中,然后在通过extern关键字来告诉编译器 这个变量已经在其他地方定义过了。 inline变量出现后,我们可以直接将全局变量定义在头文件中,而不用担心出现redefine的错误信息。
4. 条件表达式中支持初始化语句
c++17中支持在 if 或者switch 语句中进行初始化, 这个能力的出现能够让代码更加的简洁。
// c++17之前 map<int, string> c = {{1,"a"}}; { auto res = c.insert(make_pair(2, "b")); if(!res.second) { cout << "key 1 exist" << endl; } else { cout << "insert success, value:" << res.first->second << endl; } }
上面的一段代码,由于res是一个临时变量,不想影响到后面的代码,所以用一对花括号限制了其作用域。但是如果使用c++17的语法, 在if条件中初始化res,则代码就会显得更加简洁
// c++17 map<int, string> c = {{1,"a"}}; if(auto res = c.insert(make_pair(2, "b")); !res.second ) { cout << "key 1 exist" << endl; } else { cout << "insert success, value:" << res.first->sec<strong>本文来源gaodai#ma#com搞@@代~&码网</strong>ond << endl; }
c++17的标准库也进行了扩充, 新增了下面几种数据类型: