C++17 的新特性
C++标准委员会始终专注于每三年发布一次新功能。规范的两个主要部分是编程语言的核心功能和标准模板库(STL)。引入新功能是为了使代码更简洁、更简单和紧凑。以下是介绍的功能列表-:
1.折叠表达式
折叠表达式用于为可变数量的参数编写更短的代码,这些参数可以传递给函数或从函数返回。它允许使用任意数量的变量作为参数和函数的返回语句。
语法:-
一元右折叠-(packop1...)
一元左折叠-(...op1pack)
二进制左折叠-(initop1...op1pack)
二进制右折叠-(packop1...op1init)
这里的pack是一个参数包,可以为任意数量的变量进行扩展。op1是一个运算符。(-,+,<=,>=,<,>,==,*,/....)。在二元折叠中,两个op1都是相同的运算符。
init是一个不能扩展的表达式。
示例
#include <iostream>
#include <string>
using namespace std;
template<typename ...Args> auto addition(Args ...args){
return (args + ... + 0);
}
template<typename ...Args> auto sum2(Args ...args){
return (args + ...);
}
int main(){
cout << "总和是: "<<addition(1,1,1,1,1) << endl;
cout << "总和2是: "<<addition ( 1,2,3);
}输出结果总和是: 5 总和2是: 6
2.结构绑定
这些用于声明多个变量,以使用一对、元组等中的值进行初始化。所有这些变量与初始化程序的绑定都在单个语句中完成。
案例1:-绑定数组
标识符列表中的每个标识符都成为数组元素的左值名称。元素的数量必须等于标识符的数量。
intarry[3]={3,4,5};
汽车[a,b,c]=arry;
//这里创建了数组,a指的是3,b指的是4,c指的是5。
案例2:-绑定一个类似元组的类型
浮点数{};
字符ch1{};
整数{};
std::tuple<float&,char&&,int>tplex(fnum,std::move(ch1),number);
constauto&[p,q,r]=tplex;
//p是引用fnum的结构化绑定的名称
//q是引用ch1的结构化绑定的名称
//r是引用数字的结构化绑定的名称
案例3:-绑定到数据成员
结构结构变量{
可变intnum1:2;
易失性双num2;
};
结构变量func();
constauto[a,b]=func();
//a是2位位域的int左值
//b是一个constvolatiledouble左值
3.使用DirectList初始化枚举
在C++17中,枚举现在可以使用大括号初始化。
语法:-
enum byte : unsigned char {};
byte b0 {0}; //OK
byte b1 = byte{1}; //OK
byte b2 = byte{256}; // ERROR - 0 to 255 only4.If和Switch内部的变量声明
C++17允许在if和switch条件中声明变量。这使得使用具有不同作用域的相同名称的变量变得容易。
语法:-
if (data type variable condition)
{
//statements
}
switch ( condition; variable )
{
//statements
}5.ifconstexpr语句
模板代码的有用功能。ifconstexpr语句在编译时被评估。
怎么样
可以使用下面的比较来显示有用的信息:-
一般的If-else语句:-
int var = 10;
if (var >= 10) {
var=var+10;
} else {
var=var-10;
}ConstexprIf-else语句:-
template <typename T>
auto length ( T const& value ) {
//checkingifTisintegerornot
if (is_integral<T>::value) {
return value;
} else {
return value.length();
}
}6.嵌套命名空间
命名空间用于将类似的代码(如相关的类和函数)组合在一起。C++17允许使用嵌套命名空间的更简单的语法。早些时候,当嵌套命名空间的数量更多时,语法非常混乱。现在不再需要处理大括号。
在C++17之前:-
namespace Earth{
namespace Continent {
namespace Country {
class City {
..........
}; } } }新语法:-
namespace Earth :: Continent :: Country {
class City {
..........
}; }