【问题标题】:Are nested structured bindings possible?嵌套结构化绑定可能吗?
【发布时间】:2018-02-28 17:53:20
【问题描述】:

假设我有一个类型的对象

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

是否可以像这样以嵌套方式(即在范围 for 循环中使用时)访问元素类型

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

【问题讨论】:

  • 你试过了吗?
  • 是的,我试过了。它不适用于上面的语法。这就是为什么我要问这是否可能。
  • 一个问题是:如何告诉 C++ 为每个嵌套的引入名称集绑定到的每个隐藏对象使用什么 const/reference-ness? const/reference 限定符指的是所述隐藏对象,而不是为其成员/get() 引入的别名。在这种情况下,如果两者相同,我看不出有什么关系,也无法立即想到需要不同限定符的情况,但是如果它们是第二类,我不希望 C++ 添加嵌套的结构化绑定与我们目前拥有的相比。当语法可能已经很紧张时,让它们成为一等似乎很危险!

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


【解决方案1】:

不,这是不可能的。

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

【讨论】:

  • 我很好奇如果嵌套分解成为一种东西,语法如何不会与属性发生冲突。
  • 伤心。那将是更接近 Python++ 的一步。 @miradulo 我也在问自己同样的问题。在 auto [[attribute]] [var1, var2] 这样的类型限定符之后是否允许使用属性?
  • @Timo 是的,看看cppref example。属性几乎可以在任何地方。
  • @miradulo 也许额外的尾逗号?像 auto [[a,b],] = func();
【解决方案2】:

不,这是不可能的;但这是:

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

至少接近。

【讨论】:

  • 是的,我现在就是这样做的。谢谢。
  • (只是出于好奇,我还没有 100% 理解:)在这里使用通用参考有什么好处? datavalue 不是 l-values,所以这些通用 refs 最终会导致 l-value refs 吗?
  • @kaba 我很懒,如果我不在乎,可以使用auto&amp;&amp;,当我想阻止修改时使用auto const&amp;,当我想修改我正在迭代的内容时使用auto&amp;结束,auto 当我想要一个副本时,我可以修改而不影响原始序列。这里,我不管,所以我用auto&amp;&amp;auto&amp;&amp; 对我来说意味着“我不在乎它是如何存储的——别名或副本或其他任何东西”。
猜你喜欢
  • 2011-12-29
  • 2015-09-03
  • 1970-01-01
  • 2012-09-30
  • 2016-07-01
  • 2011-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多