C++17 的新特性
C++標準委員會一直致力於每三年釋出新特性。規範的兩個主要部分是程式語言的核心功能和標準模板庫(STL)。引入新特性是為了使程式碼更簡潔、更容易和更緊湊。以下是引入的新特性列表:
1. 摺疊表示式
摺疊表示式用於為可以傳遞給函式或可以從函式返回的可變數量的引數編寫更短的程式碼。它允許使用任意數量的變數作為函式的引數和返回值。
語法:
一元右摺疊 - ( 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 << "Sum is : "<<addition(1,1,1,1,1) << endl; cout << "Sum 2 is : "<<addition ( 1,2,3); }
輸出
Sum is : 5 Sum 2 is : 6
2. 結構化繫結
這些用於宣告多個變數,並用配對、元組等中的值初始化它們。所有這些變數與初始化器的繫結都在一條語句中完成。
情況1:繫結陣列
識別符號列表中的每個識別符號都成為陣列元素的左值名稱。元素數量必須等於識別符號的數量。
int arry[3] = { 3,4,5 };
auto [a,b,c] = arry;
//此處建立陣列,a 指向 3,b 指向 4,c 指向 5。
情況2:繫結元組式型別
float fnum{};
char ch1{};
int number{};
std::tuple < float&, char&&, int > tplex( fnum, std::move(ch1) , number);
const auto& [ p, q, r] = tplex;
// p 是結構化繫結名稱,指向 fnum
// q 是結構化繫結名稱,指向 ch1
// r 是結構化繫結名稱,指向 number
情況3:繫結到資料成員
struct structVar {
mutable int num1 : 2;
volatile double num2;
};
structVar func();
const auto [ a, b] = func();
// a 是一個 int 左值,用於 2 位位欄位
// b 是一個 const volatile double 左值
3. 使用直接列表初始化列舉
在 C++17 中,列舉現在可以使用大括號進行初始化。
語法:
enum byte : unsigned char {}; byte b0 {0}; // OK byte b1 = byte{1}; // OK byte b2 = byte{256}; // ERROR - 0 to 255 only
4. 在 if 和 switch 中宣告變數
C++17 允許在 if 和 switch 條件中宣告變數。這使得使用具有不同作用域的相同名稱的變數變得更容易。
語法:
if (data type variable condition) { //statements } switch ( condition; variable ) { //statements }
5. if constexpr 語句
對於模板程式碼非常有用的特性。if constexpr 語句在編譯時進行評估。
它是如何工作的
可以使用下面的比較來展示它的幫助:
一般的 if-else 語句:
int var = 10; if (var >= 10) { var=var+10; } else { var=var-10; }
constexpr if-else 語句:
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(); } }
6. 巢狀名稱空間
名稱空間用於將類似的程式碼(如相關的類和函式)分組在一起。C++17 允許使用更簡單的巢狀名稱空間語法。以前,當巢狀名稱空間數量較多時,語法非常混亂。現在不再需要處理大括號。
C++17 之前:
namespace Earth{ namespace Continent { namespace Country { class City { .......... }; } } }
新的語法:
namespace Earth :: Continent :: Country { class City { .......... }; }