我试图通过使用alph
,dict()
和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)
类型的?
答案 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
。