嵌套结构绑定是否可行?

74

假设我有一个类型为

的对象
std::map<std::string, std::tuple<int, float>> data;

是否可以嵌套地访问元素类型(例如在范围for循环中使用)?就像这样:

for (auto [str, [my_int, my_float]] : data) /* do something */

1
你试过了吗? - bipll
2
是的,我尝试过了。它与上面的语法不兼容。这就是为什么我在问它是否可能的原因。 - Timo
1
一个问题是:如何告诉C++为每个隐藏对象使用什么const/reference-ness,以便将每个嵌套的引入名称集绑定到它们?const/reference限定符指的是该隐藏对象,而不是其成员/get()的引入别名。我无法看出如果两者相同会有什么影响,在我立即想到需要不同限定符的情况下,但如果C++添加了嵌套结构绑定,我不希望它们次于我们当前拥有的功能。而使它们成为一流的似乎是危险的,因为语法可能已经很紧张了! - underscore_d
2个回答

46

不,这是不可能的。

我清楚地记得在某个地方读到过,在C++17中不允许嵌套结构化绑定,但他们正在考虑在未来的标准中允许它。 不过我找不到这个来源了。


我很好奇如果嵌套分解成为一件事情,语法将如何不与属性冲突。 - miradulo
1
遗憾。那本来会使得 Python++ 更近了一步。@miradulo 我也在自问同样的问题。在类型限定符 auto [[attribute]] [var1, var2] 之后是否允许属性? - Timo
1
@Timo 是的,请查看cppref示例。 属性几乎可以放在任何地方。 - miradulo
1
@miradulo 或许是多余的尾逗号?像这样 auto [[a,b],] = func(); - LIU Qingyuan

30

不,它们不可能;但是这个可以:

for (auto&& [key, value] : data) {
  auto&& [my_int, my_float] = value;
}

至少是相对靠近的。


1
是的,这就是我现在的做法。谢谢。 - Timo
(只是出于好奇,因为我还没有完全理解)在这里使用通用引用的好处是什么? datavalue 不是 l-value 吗,所以这些通用引用最终仍将成为 l-value 引用,对吗? - kaba
1
@kaba 我很懒,如果我不在意的话,我会使用 auto&&,如果我想阻止修改,我会使用 auto const&,如果我想修改正在迭代的内容,我会使用 auto&,如果我想要一个可以修改而不影响原始序列的副本,我会使用 auto。在这里,我不在意,所以我使用 auto&&;对我来说,auto&& 的意思是“我不在意这个是如何存储的——别名、副本或其他”。 - Yakk - Adam Nevraumont

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接