问题标签 [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.
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 遵循标准。另一方面,我觉得其意图是数组、聚合和类似元组的类型的行为是等效的。
c++ - 类模板内部类的类元组结构化绑定
我想为类模板的内部类提供结构化绑定。我怎样才能专攻std::tuple_size
那个内部课程?
我不能对数据成员使用结构化绑定,因为内部类可能是与该功能不兼容的类型。所以我需要提供类似元组的结构化绑定。为了向内部类提供这样的功能,我需要部分专注std::tuple_size
于namespace std
. 问题是我得到了(外部类的)参数的非推断上下文。T
我知道我可以将内部类放在全局命名空间中,从而解决所有问题,但是有没有办法在保持类内部时获得相同的结果?
c++ - range-v3 中范围的结构化绑定声明
c++2a 工作草案具有std::ranges::subrange
实用程序,可以将范围和视图解压缩为迭代器和哨兵;例如:
range-v3 中是否有类似的设施?
c++ - 无法使用 Boost.Bimap 解决 g++ 7.1 结构化绑定错误
在我的项目中,我使用Boost.Bimap来实现双向映射。
看看Godbolt 上这个非常简单的 MCVE,我在其中使用结构化绑定来打印正确映射的键值对(根据文档,它与std::map
.
问题
它对于任何 g++ 版本 >= 7.4 及更高版本都可以正常编译,但是我需要使用 g++ 7.1。在这里,此代码失败并显示以下消息:
我能够发现这是由于g++ 中的一个错误,该错误似乎已在更高版本中修复。
解决方法尝试(玩具示例,成功)
为了使结构化绑定与我的编译器版本一起工作,我尝试通过专门std::tuple_size
化std::tuple_element
和std::get
. 有关更多信息,请参阅此 cppreference 链接。
为简单起见,我首先用玩具结构成功地尝试了这个。以下是专业,请查看 godbolt.org 上的完整代码:
请注意,如果您删除#ifdef
for g++ 7.1.,编译将失败并出现与上述相同的错误 ( ...is not an integral constant expression
)。(有趣:与boost::bimap
仅在 g++ 7.4 及更高版本中编译良好的示例不同,玩具示例已经在 g++ 7.2 中成功)
解决方法尝试(原始示例,不成功)
现在,非常确信我找到了解决方案,我尝试做同样的事情,boost::bimap
但我无助地失败了(在 godbolt.org 上查看):
错误消息太长,无法在此处发布(请参阅 Godbolt 输出),但基本上我知道get
编译器不匹配“my”的重载。请注意,出于调试原因,我在我的代码中插入了以下行,以确保我实际上处理的是我的专业领域中的正确类型。
难道我做错了什么?还是这个错误对我的解决方法构成了不可逾越的障碍?
c++ - 如何使用结构化绑定在 C++ 中标记未使用的多个值之一?
在 C++17 中,我有一个函数通过 std::tuple 和结构化绑定返回多个值,我希望忽略其中一个返回值并抑制与此相关的任何警告。
我尝试了以下无法编译的方法:
我也试过这个:
GCC v7.3.0 都无法正常工作。
C++17 中是否有一种方法可以edge
使用结构化绑定巧妙地指定在多值返回语法中未使用的内容,或者当前语言定义中缺少此内容?
c++ - C++17 中带有 ref-qualifier 的结构化绑定的差异编译器输出
考虑下面的片段:
在编译器资源管理器上可用
在 gcc/clang 的情况下,错误是:
错误:无法将类型的非常量左值引用绑定到类型
'std::tuple<double&,int&>&'
的右值'std::tuple<double&, int&>'
但是,MSVC 不会抱怨并且编译得很好。
哪一个是正确的?
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)
这应该导致
如果有的话,是否有任何好的技术可以通过匹配开头[
和结尾来对参数进行分组]
?或者也许有更好的方法来编写我没有想到的这个宏?
c++ - 为什么结构化绑定因 'std::tie' d 对象而失败?
我很想 通过以下方式解决这个问题:
I std::tie
d 返回的迭代器std::prev
and std::next
,并允许结构化绑定进行auto
推导。
看起来它允许的唯一编译器是MSVC v19.14/O2 /std:c++17
!GCC 9.1和clang 8.0不同意这一点。见在线编译器:https ://godbolt.org/z/DTb_OZ
海湾合作委员会 说:
铿锵声 说:
查看cppreference.com 中给出的示例 MSVC 是否正确?或谁在这里,为什么?
有趣的是,在运行
给我
(在MSVS 2019中,/std:c++17
)