unordered_map的结构化绑定中的推导类型

时间:2019-11-05 22:08:06

标签: c++ c++17 structured-bindings

我试图通过使用alphdict()d = dict([(your_list[i], your_list[i+1]) for i in range(0, len(your_list),2)]) 来查看针对unordered_map的结构化绑定中的推导类型。

auto

无论我使用auto &还是auto &&#include <string> #include <iostream> #include <unordered_map> #include <type_traits> int main() { std::unordered_map<std::string, std::string> m{{"a","a1"}, {"b","b1"}}; for(auto && [k,v]:m) { std::cout << std::is_same<decltype(k), std::string const >::value << '\n'; std::cout << std::is_same<decltype(v), std::string >::value << '\n'; } } ,输出始终是

for(auto [k,v]:m)

我的问题是:

  • 为什么在for(auto & [k,v]:m)for(auto && [k,v]:m)的情况下1 1 decltype(k)不是引用类型?

  • 为什么在decltype(v)的情况下for(auto & [k,v]:m)for(auto && [k,v]:m)类型的?

1 个答案:

答案 0 :(得分:4)

问题1) 就像指定的here

  

1)如果参数是命名结构化绑定的非括号id表达式,则decltype产生 referenced 类型(在结构化绑定声明的规范中进行了描述)。

here

  

情况2:绑定类似元组的类型   [...]   第i个标识符的引用类型为std::tuple_element<i, E>::type

std::pair(请参阅问题2的答案)实际上是2的元组。因此,它是“类似于元组 ”。

因此,在这种情况下,总是返回(屈服)Key和T的基本类型。

问题2) 在内部unordered_map被分配为std::pair<const Key, T>。因此,k为const