C_and_CPP 板


LINE

※ 引述《lovejomi (JOMI)》之銘言: : 最近會看到一些c++17語法 想說來研究一下 : https://en.cppreference.com/w/cpp/language/structured_binding : 網路上介紹的文章許多 但都完全只是"介紹" 我實際上遇到一些怪異的型別推導結果 : 完全無法歸納規則 可能變成 知道可以用 但不敢亂用.... : 也許cppref 有介紹的很完整但我實在是看不太懂他表達的 : 舉幾個例子 : 1. 這屬於網頁上的case幾?我不知道.... : std::map<int, int> m; : for (auto& [k, v] : m) { : k = 123; : } : k 是const& 變成不能改 ??? why.... : 好那我 : std::map<int, int> m; : for (auto [k, v] : m) { : k = 123; : } : k是const int....哪來的const.... : 2. : int a = 1, b = 2; : const auto& [x, y] = std::tie(a, b); : x = 5566; : 一臉就是const! 但竟然x是 int&.....可以改 why....+2 : 好那我 : auto [z, w] = std::tie(a, b); : z = 123; : 我什麼都不加....乍看就是int : z竟然是int&....我不小心改到了a..... : 這我可能還可以理解 他會去decltype(z) 結果是int& 但實在不好讀也很容易誤用 最好的語言學習資源是提案, 我們來參考原提案的最新修訂版 P0144R2 [P0144R2] Structured bindings https://bit.ly/2ZNT6kJ 看提案可以了解這個語言特性被設計來解決什麼問題, 使用的方法以 及可能會遇到的問題等. 先來講最簡單的案例: 只有用到 auto 來綁 定的情形: auto [x,y,z] = f(); 需要注意的是這裡的 auto 用法和非 structured binding 的物件定 義不同, 是用來綁定等號右邊的敘述, 如果右邊是 std::tuple 則適 用以下規則: auto __a = expression; tuple_element<0, decltype(E)>::type& x = get<0>(__a); tuple_element<1, decltype(E)>::type& y = get<1>(__a); tuple_element<2, decltype(E)>::type& z = get<2>(__a); E 是該敘述的型別, 你要接 std::tie() 的結果之前最好先查一下它 的回傳型別: template< class... Types > tuple<Types&...> tie( Types&... args ) noexcept; 原本的敘述經過代換會變成: tuple<int&,int&> __a = std::tie(a, b); tuple_element<0, tuple<int&,int&>>::type& z = get<0>(__a); tuple_element<1, tuple<int&,int&>>::type& w = get<1>(__a); 再查一下 tuple_element 的 member type 作進一步代換: tuple<int&,int&> __a = std::tie(a, b); int& z = get<0>(__a); int& w = get<1>(__a); 最後決定 z/w 型別為 int& 的地方是最外層的 & 而不是 tuple_element 的 member type, 以及剛好可以用 ref to lvalue 來綁定 get 的結果. 以上就是 structured binding 對於 std::tuple 的簡單解說. 再 來是此特性的進階應用: 撰寫支援 structured binding 的自訂型 . 從 P0144R2 中間你可以看到: tuple_element<#,decltype(E)> get<#>(expression) 敘述裡都沒有加前綴 std:: 修飾符, 這代表標準允許使用者將此兩 個元件定義在自己的命名空間裡, 甚至 get 還可以作為 friend member function. 所以當我們想為自己的型別提供某種程度的抽象 化, 又不願意將資料成員 access level 都標記為 public 時, 就可 以利用這個設計: https://wandbox.org/permlink/uETqTeLuT4zyim2t -- P1389R0: Guidelines for Teaching C++ to Beginners https://bit.ly/2GvDWKb SG20 Education and Recommended Videos for Teaching C++ https://www.cjdb.com.au/sg20-and-videos --



※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 123.193.76.216 (臺灣)
※ 文章網址: https://webptt.com/m.aspx?n=bbs/C_and_CPP/M.1561489047.A.1E0.html
1F:推 sarafciel: 推 06/26 08:45
※ 編輯: poyenc (61.216.75.43 臺灣), 06/26/2019 15:21:02







like.gif 您可能會有興趣的文章
icon.png[問題/行為] 貓晚上進房間會不會有憋尿問題
icon.pngRe: [閒聊] 選了錯誤的女孩成為魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一張
icon.png[心得] EMS高領長版毛衣.墨小樓MC1002
icon.png[分享] 丹龍隔熱紙GE55+33+22
icon.png[問題] 清洗洗衣機
icon.png[尋物] 窗台下的空間
icon.png[閒聊] 双極の女神1 木魔爵
icon.png[售車] 新竹 1997 march 1297cc 白色 四門
icon.png[討論] 能從照片感受到攝影者心情嗎
icon.png[狂賀] 賀賀賀賀 賀!島村卯月!總選舉NO.1
icon.png[難過] 羨慕白皮膚的女生
icon.png閱讀文章
icon.png[黑特]
icon.png[問題] SBK S1安裝於安全帽位置
icon.png[分享] 舊woo100絕版開箱!!
icon.pngRe: [無言] 關於小包衛生紙
icon.png[開箱] E5-2683V3 RX480Strix 快睿C1 簡單測試
icon.png[心得] 蒼の海賊龍 地獄 執行者16PT
icon.png[售車] 1999年Virage iO 1.8EXi
icon.png[心得] 挑戰33 LV10 獅子座pt solo
icon.png[閒聊] 手把手教你不被桶之新手主購教學
icon.png[分享] Civic Type R 量產版官方照無預警流出
icon.png[售車] Golf 4 2.0 銀色 自排
icon.png[出售] Graco提籃汽座(有底座)2000元誠可議
icon.png[問題] 請問補牙材質掉了還能再補嗎?(台中半年內
icon.png[問題] 44th 單曲 生寫竟然都給重複的啊啊!
icon.png[心得] 華南紅卡/icash 核卡
icon.png[問題] 拔牙矯正這樣正常嗎
icon.png[贈送] 老莫高業 初業 102年版
icon.png[情報] 三大行動支付 本季掀戰火
icon.png[寶寶] 博客來Amos水蠟筆5/1特價五折
icon.pngRe: [心得] 新鮮人一些面試分享
icon.png[心得] 蒼の海賊龍 地獄 麒麟25PT
icon.pngRe: [閒聊] (君の名は。雷慎入) 君名二創漫畫翻譯
icon.pngRe: [閒聊] OGN中場影片:失蹤人口局 (英文字幕)
icon.png[問題] 台灣大哥大4G訊號差
icon.png[出售] [全國]全新千尋侘草LED燈, 水草

請輸入看板名稱,例如:Soft_Job站內搜尋

TOP