[问题] 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