[問題] C++17 Structured binding 型別無法理解

作者: lovejomi (JOMI)   2019-06-23 03:00:34
最近會看到一些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& 但實在不好讀也很容易誤用
還有很多看不是很懂...
總覺得找不到可以簡單記憶的規則 連VC滑鼠移過去顯示的型態也是錯的....
請問版上有人能通透理解這些規則嗎@@
不然我還是覺得寫17以前寫法
for (const auto& p : map) 我可以明確知道他在寫什麼好懂許多
討論一下~
謝謝
作者: suhorng ( )   2019-06-23 05:52:00
因為 k, v 的 type 要查 map 的 iterator 指向什麼呀for-range 轉成 for + begin/end, 然後 map 的
作者: RishYang (Rish)   2019-06-23 05:54:00
key是const是map的性質
作者: suhorng ( )   2019-06-23 05:55:00
value_type 是 std::pair<const Key, T>, 所以自然由auto& [k,v] = *it 知道 k 是 const
作者: RishYang (Rish)   2019-06-23 05:56:00
pair<const K, T>tuple<Types&...> tie( Types&... args )
作者: lovejomi (JOMI)   2019-06-23 12:12:00
晚點理解一下 但意思是我無法馬上從code一眼看出型別 這樣好嗎?而且2. 我寫了const 竟然沒用,感覺很容易誤會
作者: Fenikso (薪水小偷)   2019-06-23 13:36:00
我覺得這有一半是tie的問題..2的a是const ref to int, 不是ref to const intx 打錯
作者: hsnuyi (羊咩咩~)   2019-06-23 16:16:00
先搞懂map是啥
作者: suhorng ( )   2019-06-23 16:24:00
我查你貼的連結, 提到 cv-auto 的地方在 array type A那裡, 所以看來是用到 array 上的時候才看得出來?我猜 const 不是加到 [???,???,...] 裡面的 identifier所以才會乍看之下沒有效
作者: lovejomi (JOMI)   2019-06-23 16:32:00
key是const 但我如果是by value copy 他不該保留const吧?
作者: suhorng ( )   2019-06-23 16:43:00
可是看他 case 2 寫的, 不管前面有沒有 cv 或不管有沒有&, && 都是 "reference to std::tuple_element<i, E>::ty
作者: lovejomi (JOMI)   2019-06-23 16:44:00
@fenikso: const ref 沒這種東西吧?一般語法也寫不出int &const foo; 還是這裡有什麼高深原理?
作者: RishYang (Rish)   2019-06-23 18:25:00
map與pair都不是array type所以不會copy行為
作者: firejox (Tangent)   2019-06-23 19:29:00
為何用std::tie,用std::tuple不好嗎
作者: xavier13540 (柊 四千)   2019-06-23 20:14:00
map系列的key都是const 實際上這也很合理
作者: Fenikso (薪水小偷)   2019-06-23 20:57:00
對, 一般語法寫不出const ref, 但是在裡面有type alias的情況下會允許這種組合出現, 然後compiler會好心的幫你把const丟掉例如說你可以寫 using T = int&; using U = const T;這時候U = const T = const ref to int = ref to int;
作者: lovejomi (JOMI)   2019-06-24 05:17:00
謝謝 原來這樣會去掉const

Links booklink

Contact Us: admin [ a t ] ucptt.com