【问题标题】:In this syntax, what is the actual type of auto?在这种语法中,auto 的实际类型是什么?
【发布时间】:2022-01-27 05:27:12
【问题描述】:

在 C++17 for 循环语法 for(auto [key, val]: students) 中,auto 替换了什么?

如果学生是,例如std::map<int,char*>,如果不是auto,会写什么?我什至不明白它在取代什么。 [int,char*]?

【问题讨论】:

  • 这称为structured binding
  • 在这种情况下,auto 所指的类型不存在。
  • @frozenca:是的,有。这是一个pair<const int, char*>,它是map的value_type。
  • @NicolBolas:但你不能写for (std::pair<const int, char*> [key, val] : students)
  • @Jarod42:没错,你不会写。但是结构化绑定需要有这样的类型。可以是一对,也可以是一个元组,但可以是另一个用户定义的类型。在这种情况下,确实是std::pair<const int, char*>。因为它是一对,所以你绑定了 2 个元素。

标签: c++ for-loop c++17 auto


【解决方案1】:

type [a,b,c] 是一个结构化绑定,它们会强制你使用auto(可能用const 和/或&/&& 装饰)。

但除此之外,auto 扩展为与将 [...] 替换为变量名时相同的类型。在

for (auto elem : students)

...auto 扩展为 std::pair<const int, char *>

在结构化绑定中,它会扩展为相同的类型,但生成的这种类型的“变量”是未命名的。

然后,对于括号中的每个名称,引入一个引用(或类似于引用的东西),它指向该未命名变量的元素之一。

【讨论】:

  • 很遗憾,但感谢您的解释。这充分说明了情况。
【解决方案2】:

std::map 填充有std::pair<const int, char*>,因此编写此循环的一种方法是

for (std::pair<const int, char*> pair : students)

我们也可以用std::tie 分隔这对,但是这个语法不能在循环中使用:

int key;
char* value;
std::pair<int, char*> pair;
std::tie(key, value) = pair;

声明 auto [key, val] 替换 std::tie。这种语法称为structured binding

【讨论】:

  • 请注意,虽然结构化绑定的变量可以是 const,但对于使用 std::tie“解包”的变量,这将不适用。
猜你喜欢
  • 2016-01-21
  • 2020-03-10
  • 2015-09-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多