【问题标题】:What type of structs can structured bindings work with结构化绑定可以使用什么类型的结构
【发布时间】:2016-12-01 02:27:27
【问题描述】:

我在http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/p0144r0.pdf 浏览了有关结构化绑定的论文,但我无法很好地了解语法允许绑定到哪些类型的结构。我最好的猜测是结构必须是聚合类型。或者只有公共数据成员的东西。

我对此有什么遗漏吗?

【问题讨论】:

  • 对和元组似乎是很好的例子,并且映射节点类型。
  • @KerrekSB :) 是的,我明白了,我只是想了解更多关于它们可以绑定到哪些类型的结构的详细信息,例如我有自己的结构。
  • 当然。如果您不想依赖公共成员,例如可以针对您的类型专门化 std::getstd::tuple_size
  • “聚合”是关于初始化,而不是布局。您可能想要一些更接近“标准布局”的条件(尽管您确实需要所有成员都是公开的,而不仅仅是具有相同的访问级别)。
  • @KerrekSB 啊是的,我没想过专门研究std::getstd::tuple_size。虽然我不确定这是否足以确保结构化绑定语法适用于任何类/结构。

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


【解决方案1】:

如果您不想针对您的类型专门化 std::tuple_sizestd::tuple_elementget,那么 [dcl.decomp] 需要:

否则,E 的所有非静态数据成员都应是 E 的公共直接成员或相同的明确成员 EE 的公共基类不得有匿名联合成员,且 identifier-list 应等于E 的非静态数据成员数。

所以基本上所有数据成员都需要在同一个类中声明,并且它们都需要是公共的,并且您需要提供与成员数量相同的名称。

【讨论】:

  • 也许这是 gcc/clang 错误/缺乏正确的实现,但是两个编译器都要求结构是可复制的——我的意思是有复制构造函数。你能对此发表评论吗?如果您认为值得将此 Q/A 记录在案,我可以提出这个问题?
  • @PiotrNycz:我建议你等到 C++17 发布;那么这将是一个很好的问题。
猜你喜欢
  • 2018-01-10
  • 2019-04-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多