C++17新特性学习笔记
c++17最新特性筆記
1.基本語言特性
? 這一部分介紹了 C++17中新的核心語言特性,但不包括那些專為泛型編程(即 template)設計的特性。
結構化綁定
結構化綁定允許你用一個對象的元素或對象初始化多個實例(第一眼感覺Python解包很像)
這有一個結構體
struct MyStruct {int i = 0;std::string s; }; MyStruct ms;可以通過如下聲明把該結構體的兩個成員綁定到新的變量名
auto [u, v] = ms; auto [u1, v1] {ms}; auto [u2, v2] (ms);結構化綁定對于返回結構體或者數組的函數非常有用
MyStruct returnStruct() {return MyStruct{ 42,"Tom" }; }我們可以把結構體中的成員變量分別賦值給兩個新的局部變量
auto [id, name] = returnStruct();還可以再進行操作
if (id>16){/*...*/}結構化綁定還能大幅提高代碼的可讀性
例如:
不使用結構化綁定,對std::map的遍歷需要這么寫
for (auto& elem : m1){cout << elem.first << elem.second;}下面是使用結構化綁定:
for (const auto& [key,value] : m1){cout << key << value << endl;}增加了代碼的可讀性(真的越來越現代了cpp)
1.1.1細說結構化綁定
綁定到一個匿名實體
auto [u, v] = ms;這段代碼實際上是做了如下操作:
auto e = ms; ... u = e.i; ... v = e.s;這就意味這u,v是結構體內成員變量的拷貝(拷貝對象e的生命周期和結構化綁定一樣長)
e 的生命周期和結構化綁定的生命周期相同,當結構化綁定離開作用域時 e 也會被自動銷毀。另外,除非使用了引用,否則修改結構化綁定的變量并不會影響被綁定的變量:
MyStruct ms{42, "hello"}; auto [u, v] = ms; ms.i = 77;使用修飾符
我們可以在結構化綁定中使用修飾符,例如 const 和引用,這些修飾符會作用在匿名實體 e 上。通常情況
下,作用在匿名實體上和作用在結構化綁定的變量上的效果是一樣的,但有些時候又是不同的(見下文)。
例如,我們可以把聲明一個結構化綁定聲明為 const 引用:
const auto& [u, v] = ms; // 引 用, 因 此u/v指 向ms.i/ms.s這里,匿名實體被聲明為 const引用,而u 和 v 分別是這個引用的成員 i 和s 的別名。因此,對ms 的成員的修
改會影響到 u 和 v 的值:
ms.i = 77; // 影 響u的 值std::cout << u; // 打 印 出77如果聲明為非 const引用,你甚至可以修改對象的成員:
MyStruct ms{42, "hello"};auto& [u, v] = ms; // 被 初 始 化 的 實 體 是ms的 引 用ms.i = 77; // 影 響 到u的 值std::cout << u; // 打 印 出77u = 99; // 修 改 了ms.istd::cout << ms.i; // 打 印 出99如果一個結構化綁定是引用類型,而且是對一個臨時對象的引用,那么和往常一樣,臨時對象的生命周期會被
延長到結構化綁定的生命周期:
MyStruct getStruct();...const auto& [a, b] = getStruct();std::cout << "a: " << a << '\n'; // OK修飾符并不是作用在結構化綁定引入的變量名上
修飾符會作用在新的匿名實體上(即上文中的e)而不會是u,v上
const auto&[u,v] = ms;u和v都不是引用,只有匿名實體e是引用。u 和 v 分別是 ms 對應的成員的類型,只不過變成了const 的。根據我們的推導,decltype(u) 是 const int,decltype(v) 是const std::string。
結構體綁定適用的場景
原則上講,結構化綁定適用于所有只有 public 數據成員的結構體、C風格數組和類似元組 (tuple--like)的對象:
? 對于所有非靜態數據成員都是 public 的結構體和類,你可以把每一個成員綁定到一個新的變量名上。
? 對于原生數組,你可以把數組的每一個元素都綁定到新的變量名上。
? 對于任何類型,你可以使用 tuple-like API 來綁定新的名稱,無論這套 API 是如何定義“元素”的。對于一個類型 type這套 API 需要如下的組件:
-
std::tuple_size<type>::value 要返回元素的數量。
-
std::tuple_element<idx, type>::type 要返回第 idx 個元素的類型。
-
一個全局或成員函數 get<idx>() 要返回第 idx 個元素的值。
注意要使用結構化綁定需要繼承時遵循一定的規則。所有的非靜態數據成員必須在同一個類中定義(也就是說,這些成員要么是全部直接來自于最終的類,要么是全部來自同一個父類):
struct B {int a = 0;int b = 3; };struct B1 :B {int c = 4; }; auto [x, y] = B{};//OK auto [x1, y1, z1] = B1{};//ERROR原生數組
int arr[] = { 1,2 }; auto [a1, b1] = arr; //按值拷貝std::pair, std::tuple 和 std::array
總結
以上是生活随笔為你收集整理的C++17新特性学习笔记的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 搞工程和搞电子的人摆摊能做什么?
- 下一篇: C++并行与并发