C++ 标准委员会始终专注于每三年发布一次新功能。规范的两个主要部分是编程语言的核心功能和标准模板库 (STL)。引入新功能是为了使代码更简洁、更简单和紧凑。以下是介绍的功能列表-:
折叠表达式用于为可变数量的参数编写更短的代码,这些参数可以传递给函数或从函数返回。它允许使用任意数量的变量作为参数和函数的返回语句。
一元右折叠 - ( pack op1 ... )
一元左折叠 - ( ... op1 pack )
二进制左折叠 - ( init op1 ... op1 pack )
二进制右折叠 - ( pack op1 ... op1 init )
这里的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
这些用于声明多个变量,以使用一对、元组等中的值进行初始化。所有这些变量与初始化程序的绑定都在单个语句中完成。
案例 1:- 绑定数组
标识符列表中的每个标识符都成为数组元素的左值名称。元素的数量必须等于标识符的数量。
int arry[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);
const auto& [ p, q, r] = tplex;
// p 是引用 fnum 的结构化绑定的名称
// q 是引用 ch1 的结构化绑定的名称
// r 是引用数字的结构化绑定的名称
案例 3:- 绑定到数据成员
结构结构变量{
可变 int num1 : 2;
易失性双 num2;
};
结构变量func();
const auto [ a, b] = func();
// a 是 2 位位域的 int 左值
// b 是一个 const volatile double 左值
在 C++17 中,枚举现在可以使用大括号初始化。
enum byte : unsigned char {}; byte b0 {0}; // OK byte b1 = byte{1}; // OK byte b2 = byte{256}; // ERROR - 0 to 255 only
C++17 允许在 if 和 switch 条件中声明变量。这使得使用具有不同作用域的相同名称的变量变得容易。
if (data type variable condition) { //statements } switch ( condition; variable ) { //statements }
模板代码的有用功能。if constexpr 语句在编译时被评估。
怎么样
可以使用下面的比较来显示有用的信息:-
int var = 10; if (var >= 10) { var=var+10; } else { var=var-10; }
template <typename T> auto length ( T const& value ) { //checking if T is integer or not if (is_integral<T>::value) { return value; } else { return value.length(); } }
命名空间用于将类似的代码(如相关的类和函数)组合在一起。C++17 允许使用嵌套命名空间的更简单的语法。早些时候,当嵌套命名空间的数量更多时,语法非常混乱。现在不再需要处理大括号。
namespace Earth{ namespace Continent { namespace Country { class City { .......... }; } } }
namespace Earth :: Continent :: Country { class City { .......... }; }