问题标签 [structured-bindings]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
757 浏览

c++ - 对 const c 数组副本的结构化绑定应该是 const 吗?

考虑这段代码(演示):

对c 数组副本的结构化绑定由 Clang声明为const ,由 GCC声明为非 const 。const

GCC 对 c 数组的行为与观察到的聚合或类元组类型的行为一致。

另一方面,从我对标准的阅读来看,我认为 Clang 遵循所写的内容。在[dcl.struct.bind]/1中, e 具有 cv A类型,其中 A 是初始化表达式的类型,而cv是结构化绑定声明的 cv 限定符。并且初始化表达式的类型ar对应于[expr.type]/1 const int[2]

应该期待什么?我的观点是 Clang 遵循标准。另一方面,我觉得其意图是数组、聚合和类似元组的类型的行为是等效的。

0 投票
2 回答
79 浏览

c++ - 来自 std::tuple 的引用绑定类型

0 投票
2 回答
160 浏览

c++ - 类模板内部类的类元组结构化绑定

我想为类模板的内部类提供结构化绑定。我怎样才能专攻std::tuple_size那个内部课程?

我不能对数据成员使用结构化绑定,因为内部类可能是与该功能不兼容的类型。所以我需要提供类似元组的结构化绑定。为了向内部类提供这样的功能,我需要部分专注std::tuple_sizenamespace std. 问题是我得到了(外部类的)参数的非推断上下文。T

我知道我可以将内部类放在全局命名空间中,从而解决所有问题,但是有没有办法在保持类内部时获得相同的结果?

0 投票
2 回答
843 浏览

c++ - const 上的结构化绑定

以下代码应该编译吗?

  • MSVC说“是的!”。
  • GCC说“哦,不,伙计!”。
  • Clang说“不可能!”。

那么,这是一个MSVC错误吗?

这里的标准并不简单(我快速浏览了一下),但考虑到 的规则auto,我想,a应该b复制丢弃cv-qualifier

0 投票
0 回答
239 浏览

c++ - range-v3 中范围的结构化绑定声明

c++2a 工作草案具有std::ranges::subrange实用程序,可以将范围和视图解压缩为迭代器和哨兵;例如:

range-v3 中是否有类似的设施?

0 投票
1 回答
141 浏览

c++ - 无法使用 Boost.Bimap 解决 g++ 7.1 结构化绑定错误

在我的项目中,我使用Boost.Bimap来实现双向映射。

看看Godbolt 上这个非常简单的 MCVE,我在其中使用结构化绑定来打印正确映射的键值对(根据文档,它与std::map.

问题

它对于任何 g++ 版本 >= 7.4 及更高版本都可以正常编译,但是我需要使用 g++ 7.1。在这里,此代码失败并显示以下消息:

我能够发现这是由于g++ 中的一个错误,该错误似乎已在更高版本中修复。

解决方法尝试(玩具示例,成功)

为了使结构化绑定与我的编译器版本一起工作,我尝试通过专门std::tuple_sizestd::tuple_elementstd::get. 有关更多信息,请参阅此 cppreference 链接

为简单起见,我首先用玩具结构成功地尝试了这个。以下是专业,请查看 godbolt.org 上的完整代码

请注意,如果您删除#ifdeffor g++ 7.1.,编译将失败并出现与上述相同的错误 ( ...is not an integral constant expression)。(有趣:与boost::bimap仅在 g++ 7.4 及更高版本中编译良好的示例不同,玩具示例已经在 g++ 7.2 中成功)

解决方法尝试(原始示例,不成功)

现在,非常确信我找到了解决方案,我尝试做同样的事情,boost::bimap但我无助地失败了(在 godbolt.org 上查看):

错误消息太长,无法在此处发布(请参阅 Godbolt 输出),但基本上我知道get编译器不匹配“my”的重载。请注意,出于调试原因,我在我的代码中插入了以下行,以确保我实际上处理的是我的专业领域中的正确类型。

难道我做错了什么?还是这个错误对我的解决方法构成了不可逾越的障碍?

0 投票
0 回答
156 浏览

c++ - 如何使用结构化绑定在 C++ 中标记未使用的多个值之一?

在 C++17 中,我有一个函数通过 std::tuple 和结构化绑定返回多个值,我希望忽略其中一个返回值并抑制与此相关的任何警告。

我尝试了以下无法编译的方法:

我也试过这个:

GCC v7.3.0 都无法正常工作。

C++17 中是否有一种方法可以edge使用结构化绑定巧妙地指定在多值返回语法中未使用的内容,或者当前语言定义中缺少此内容?

0 投票
0 回答
56 浏览

c++ - C++17 中带有 ref-qualifier 的结构化绑定的差异编译器输出

考虑下面的片段:

在编译器资源管理器上可用

在 gcc/clang 的情况下,错误是:

错误:无法将类型的非常量左值引用绑定到类型'std::tuple<double&,int&>&'的右值'std::tuple<double&, int&>'

但是,MSVC 不会抱怨并且编译得很好。

哪一个是正确的?

0 投票
1 回答
237 浏览

c++ - 如何在宏中正确转发结构化绑定参数

我想编写一个宏,它可以采用任意数量的变量绑定,后跟一个表达式,并将它们重写为 lambda 函数。目标是看看是否有可能使用当前的语言特性来实现类似简洁的 lambda 语法建议,或者这是否必须由编译器处理。

这里的挑战是宏不支持,内部参数,并且不允许将结构化绑定包装在 中(),这是解决此问题的最简单的解决方法(至少在 clang 中)。另一个常见的解决方法是定义一个COMMA宏,但由于我试图使用更简洁的 lambda 语法,所以这不是一个选项。

我设法通过使用__VA_ARGS__和连接除最后一个参数之外的所有内容来为单参数函数实现此功能:

  • FN(x, x == 0)结果是[&](auto&& __arg) { auto& x = __arg; return x == 0; }
  • FN([x, y], x == y)结果是[&](auto&& __arg) { auto& [x, y] = __arg; return x == y; }

你可以在godbolt上看到完整的实现。

但是,我一直在尝试实施一般的 n 参数FN([x, y], c, [f, g, h], f*x - y + c / h * g)

这应该导致

如果有的话,是否有任何好的技术可以通过匹配开头[和结尾来对参数进行分组]?或者也许有更好的方法来编写我没有想到的这个宏?

0 投票
1 回答
378 浏览

c++ - 为什么结构化绑定因 'std::tie' d 对象而失败?

我很想 通过以下方式解决这个问题:

I std::tied 返回的迭代器std::prevand std::next,并允许结构化绑定进行auto推导。

看起来它允许的唯一编译器是MSVC v19.14/O2 /std:c++17GCC 9.1clang 8.0不同意这一点。见在线编译器:https ://godbolt.org/z/DTb_OZ

海湾合作委员会 说:

铿锵声 说:

查看cppreference.com 中给出的示例 MSVC 是否正确?或谁在这里,为什么?

有趣的是,在运行

给我

在此处输入图像描述

(在MSVS 2019中,/std:c++17