在无序映射的结构化绑定中推导类型
Deduced type in structured binding of 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
我的问题是:
在
for(auto & [k,v]:m)
或for(auto && [k,v]:m)
的情况下,为什么decltype(k)
和decltype(v)
不是参考类型?为什么CCD_ 11在CCD_ 13的情况下是CCD_?
问题1(如此处指定
1(如果参数是命名结构化绑定的未加括号的id表达式,则decltype生成引用的类型(在结构化绑定声明的规范中描述(。
和此处:
案例2:绑定一个类似元组的类型[…]第i个标识符的引用类型是
std::tuple_element<i, E>::type
。
std::pair
(请参阅问题2的答案(实际上是2的元组。因此,它是"tuple-like"。
因此,在这种情况下,Key和T的基本类型总是被返回(产生(。
问题2(在内部,CCD_ 16被分配为CCD_ 17。因此,k是const
。
相关文章:
- 我想将一个对T类型的非常量左值引用绑定到一个T类型的临时值
- 运行时错误:引用绑定到类型为"int"的空指针
- 无法将运行时类绑定到 XAML T 必须是 WinRT 类型
- 运行时错误:引用绑定到类型"int"的未对齐地址0xbebebebebebebec6,这需要 4 个字节对齐 (stl_vector.h)
- 无法将类型"T&"的非常量左值引用绑定到类型"T"的右值 t++ std::atomic<T>
- 结构化绑定初始值设定项表单 { 赋值表达式 } 对于 clang 上的数组类型失败
- 在其他容器中使用 boost::container::static_vector 时,GCC 编译错误"将'const s'绑定到类型's&'的引用丢弃限定符"
- 为什么定义复制构造函数会给我错误:无法将类型 'obj&' 的非常量左值引用绑定到类型为"obj"的右值?
- 错误:对类型 'const ItemInstance' 的引用无法绑定到类型 'void' 的右值
- 没有类型结构绑定不起作用?
- 为什么"const auto [x, y]"绑定到引用类型时没有按预期运行?
- std::绑定variadic模板和自动返回类型
- 如何对绑定的成员方法进行typedef,然后将该类型用作模板参数
- 在无序映射的结构化绑定中推导类型
- 错误:在类型 "blah blah" 的绑定引用中删除限定符以初始化"some other blah blah"
- 您自己的类型的结构化绑定,不是结构或元组(通过公共成员函数)
- 使用 pybind11 绑定 typedef 类型的正确语法是什么?
- C++ 如何将参数绑定到具有相同返回类型的函数,并将它们全部存储在一个容器中
- 为什么按引用传入会导致绑定引用类型错误
- 类型绑定引用中的限定符和 const 类型的初始值设定项中删除