问题标签 [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++ - Are the idendifiers of a structured binding initialized in order?
It was hard to deduce from the proposal.
Will C++17 structured bindings initialize their identifiers from left to right?
Is this guaranteed to print "first", "second", then "third"?
c++ - Structured bindings implementation underground and std::tuple
Is it true, that structured bindings in clang
(I use recently builded clang version 4.0.0 (trunk 282683)
) are implemented using some stuff from <tuple>
, like braces-init lists may use stuff from <initializer_list>
?
I wrote simple code just to play with some of latest features implemented:
So far so good, but when I add const
qualifier before auto
:
I get a strange error description:
I.e. there is interaction with accidentally included <tuple>
.
I know that structured bindings are partially implemented in clang
, but either way it is interesting how <tuple>
may be related to them?
Should I include <tuple>
to use structured bindings?
Additional:
auto
, auto &
and auto &&
works, but auto const
and auto const &
not.
c++ - 结构化绑定宽度
是否可以使用结构化绑定语法来确定我应该在方括号中指定多少个变量名称以匹配普通右侧的数据成员数struct
?
我想成为通用库的一部分,它使用结构化绑定将任意类分解为其组成部分。目前没有结构化绑定的可变参数版本(而且,我认为,不能用于当前提出的语法),但我的第一个想法是对一些函数进行一组重载decompose()
,它将参数分解struct
为一组它的成分。decompose()
应该被参数的(即struct
)数据成员的数量重载。目前constexpr if
语法也可以用来调度这个。但是为了上述目的,我怎样才能模拟类似于sizeof...
operator 的东西呢?我不能auto [a, b, c]
在 SFINAE 结构中的某处使用语法,因为它是一个分解声明并且 AFAIK 任何声明都不能在里面使用decltype
,我也不能在 lambda 函数的主体中使用它,因为 lambda 函数也不能在模板参数中使用。
当然,我想要内置运算符(使用类似sizeof[] S
/ sizeof[](S)
for的语法class S
),但也可以接受以下内容:
也许constexpr
lambda 将允许我们将它们用于模板的参数。你怎么看?
未来的概念是否有可能?
c++ - 结构化绑定替换 std::tie 滥用
在阅读c++17 最终特性的摘要时,我对结构化绑定部分(强调我的)有点惊讶:
结构化绑定
到目前为止,有一个已知的技巧是滥用 std::tie 直接将元组或对分配给不同的变量,而不必手动处理结果类型。这是一个 hack,变量也必须存在,现在您可以在一行中声明变量并初始化它们:
自动 [a , b , c] = getvalues();
需要大括号,getvalues 返回一个元组。提案中没有提到 std::pair ,因此不清楚这是否适用于 pair ,它是由 STL 在某些插入方法中返回的。
我假设他们指的是这种用法std::tie
我认为这是推荐的做法。
有人可以解释为什么他们将上述示例称为黑客吗?
c++ - 为什么 C++17 结构化绑定不使用 {}?
我在这里找到了 *C++ 结构化绑定的原始提案。它提出了一种轻松绑定多个返回值的方法,即:
但是现在看到大家都指向了C++17/C++1z的提案语法
既然我知道了“列表是这样写的{就像这个}”,那么有一个新的列表语法吗?为什么?这里的花括号有什么问题?
c++ - std::ignore 与结构化绑定?
序幕:
C++1z 将引入结构化绑定的语法,这将使编写而不是
就像是
但是,std::tie
也允许指定std::ignore
忽略某些组件,例如:
是否可以使用新的结构化绑定语法做类似的事情?它将如何运作?
c++ - 结构化绑定可以使用什么类型的结构
我在这里浏览了关于结构化绑定的论文http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/p0144r0.pdf但我无法很好地了解哪些类型structs 语法允许绑定到。我最好的猜测是结构必须是聚合类型。或者只有公共数据成员的东西。
我对此有什么警告吗?
c++ - 结构化绑定中的 const 引用是否会延长分解对象的生命周期?
写作是否const auto& [a, b] = f();
保证延长从返回的对象的生命周期f()
,或者至少是对象a
和b
绑定的对象?通读该提案,我没有看到任何明显的语言来确保它确实有效,除非它只是被其他东西所涵盖。但是,以下内容不会延长临时的生命周期,所以我看不出它会如何被覆盖:
在论文的顶部,它似乎暗示它已被覆盖
分解声明的 cv-qualifiers 和 ref-qualifier 应用于为初始化程序引入的引用,而不是单个成员别名
但是在实际标准的建议措辞中,我看到的最接近的提及如下,尽管我不确定如何阅读它以获得我正在寻找的保证:
如果 e 是一个无括号的 id 表达式,命名从分解声明的标识符列表中引入的左值或引用,则 decltype(e) 是分解声明规范中给出的引用类型
似乎 gcc 和 clang 都将返回的对象的生命周期延长到基于wandbox 实验的范围结束。为我自己的类型实现所有花里胡哨的更丑陋的似乎延长了外部对象及其其他数据成员的生命周期。
尽管几乎可以肯定作者的意图,但我想确定该语言保证这是安全的。
c++ - 与 [[maybe_unused]] 的结构化绑定
具有模式匹配的函数式语言(有时?)有可能忽略一些绑定值,但是对于 C++17 结构化绑定,似乎没有办法做到这一点(std::ignore 与结构化绑定?)。建议是使用虚拟名称,但随后我们会收到有关未使用变量的警告。
使用 clang 和 gcc 的最新负责人,这是预期的事情,这很好而且有用,
但我也希望这会奏效:
是否有特定原因不能在这里使用属性?(在标准和技术上)。gcc 或 clang 都不接受这一点。
编辑,收集支持状态:(感谢godbolt/compiler explorer)。它按预期工作(也可能更早):
在https://gcc.godbolt.org/z/H2duYd在 Godbolt 中试用
c++ - 为什么分解声明不能是 constexpr?
考虑以下代码片段来测试即将到来的 C++17 功能分解声明(以前称为结构化绑定)
这在 g++7-SVN 和 clang-4.0-SVN 上都失败,并显示以下消息:
分解声明不能声明为“constexpr”
删除constexpr
定义并更改为常规assert()
适用于两个编译器。
关于这个特性的 WG21 论文都没有提到constexpr
关键字,无论是正面还是负面。
问题:为什么不允许分解声明constexpr
?(除了“因为标准这么说”)。