问题标签 [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 回答
1384 浏览

c++ - 不可能与现有变量进行结构化绑定?

是否可以使用已经存在的变量作为返回值的目标structured bindings

0 投票
1 回答
735 浏览

c++ - 结构化绑定的函数声明

结构化绑定只能与某种“结构”一起使用作为返回值吗?

归还任何类/结构,例如这里的元组可以正常工作:

有没有什么东西可以实现:

0 投票
4 回答
10847 浏览

c++ - 结构化绑定的用例是什么?

C++17 标准引入了一个新的结构化绑定特性,该特性最初是在 2015 年提出的,其语法外观被广泛讨论

浏览文档后,您会立即想到它们的一些用途。

聚合分解

让我们声明一个元组:

使用结构化绑定可以很容易地在一行中获得命名的元素副本:

这相当于:

或者

对元组元素的引用也可以轻松获得:

所以我们可以使用所有成员都是公共的数组或结构/类。

多个返回值

一种从函数中获取多个返回值的便捷方法紧随其后。

还有什么?

您能否为结构化绑定提供一些其他可能不太明显的用例?它们还能如何提高 C++ 代码的可读性甚至性能?

笔记

正如评论中提到的,结构化绑定的当前实现缺乏一些特性。它们是非可变的,它们的语法不允许显式跳过聚合成员。在这里可以找到关于可变性的讨论。

0 投票
3 回答
685 浏览

c++ - 为什么 ADL 不能使用 std::get 解析为正确的函数

我正在尝试编写一个模板函数,该函数使用解析get为获取结构/范围(tuple-esque)的成员的 ADL。

我这样做是因为结构化绑定提案(http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/n4659.pdf §11.5.3)说明了如何get使用从结构中获取元素。它说非成员get用于从结构中获取元素。

我假设上面的代码会编译,因为 ADL 会导致get在命名空间中查找函数std(因为它的参数类型是std::tuple<int, int>,它是 in std),在那里可以找到它。但是,我得到一个错误。有人可以在这里解释正确的方法以及为什么上面的代码不起作用吗?在这种情况下如何强制 ADL 发生?

0 投票
2 回答
4194 浏览

c++ - 可以在多态 lambda 中使用结构化绑定语法吗

结构化绑定使遍历具有基于范围的 for 循环的地图更加清晰和可读,如下所示

但是结构化绑定可以在如下 lambda 表达式中使用吗?

从看起来上面的代码不适用于我在这里找到的在线 C++ 编译器https://wandbox.org/permlink/sS6r7JZTB3G3hr78

如果它不起作用,那么是否有充分的理由不支持上述内容?还是只是尚未提出的东西?模板只会在使用时被实例化,因此结构化绑定的“解除绑定”过程可以发生在请求实例化的地方(即调用函数时)

0 投票
2 回答
1695 浏览

c++ - 复制省略是否适用于结构化绑定

强制复制省略是否适用于通过结构化绑定进行的分解?这适用于以下哪些情况?

我怀疑只有第三种情况允许复制省略,因为前两种情况将通过std::get<>and “分解”,std::tuple_size<>std::get<>在参数为右值时返回 xvalues

来自标准的报价也很好!

0 投票
1 回答
1200 浏览

c++ - 为类提供类似元组的结构化绑定访问

我正在尝试支持类的类似元组的结构化绑定访问。为简单起见,我将在本文的其余部分使用以下类:

(我知道这个类支持开箱即用的结构化绑定,但我们假设它不支持。)

启用对 的成员的类似元组的访问Test,我们必须专门化std::tuple_sizestd::tuple_element

我们需要的最后一部分是或 的命名空间中的Test::get<i>一个函数。让我们实现后者:get<i>(Test)Test

这行得通。但是,我想返回对Test的成员的引用std::get(std::tuple),例如 。因此,我实现get如下:

但是,对于此版本,以下代码

产生错误(GCC 7.1):

将 'std::tuple_element<0, Test>::type& {aka int&}' 类型的引用绑定到 'const int' 丢弃限定符

因此,似乎为get<i>(const Test&)结构化绑定选择了重载。由于此重载返回 a const int&,并且v像对 的非const引用一样int,因此代码无法编译。

然而,据此,auto [v] = test;应该大致相当于

确实有效,因为它使用了get<i>(Test&)重载。

关于为什么我的实现get不适用于结构化绑定的任何想法?

0 投票
1 回答
481 浏览

c++ - 使用结构绑定更改自定义结构的值

我正在尝试找到一种方法来使用结构化绑定更改自定义结构的值。我能够做到这一点。我从结构化绑定std::map中引用了一些材料

在下面的代码中,我能够更改 map 的值。我想将unsigned salary默认值 1000 更改为 10000

输出

改变我试图得到预期的输出

我得到的错误

无法使用 const 限定类型“const int”分配给变量“salary”

预期产出

提前感谢您的任何解决方案和建议

0 投票
2 回答
4995 浏览

c++ - 您自己的类型的结构化绑定不是结构或元组(通过公共成员函数)

我正在通过 Herb Sutter's

旅程:迈向更强大、更简单的 C++ 编程

结构绑定部分

为了理解这个概念。最好是写一个我试过但得到一些错误的程序

只是想尝试如何在具有私有数据的类上使用结构绑定。请忽略以下示例。如果您可以提供任何示例

错误

if constexpr(I == 0) return x._ival;//'_ival' 是 'foobar' 的私有成员

else if constexpr(I == 1) return xs;//'s' 是 'foobar' 的私有成员

auto [ n, s] = f( 1024,"hello" );//不能分解非公开

需要帮助

1.如果有人可以详细说明他在这些方面实际尝试做什么(请参阅提供的链接)

2.任何建议如何解决上述示例的错误

0 投票
1 回答
6704 浏览

c++ - 为什么基于范围的 for 循环中的结构化绑定只是副本而不是引用?

我有以下代码:

我的问题:

为什么第一个断言语句没有通过而第二个通过?为什么我不能在基于范围的 for 循环中更改地图中 afoo的值?foos

编译器: MSVS++17 Visual Studio 15.3.2

编辑:如果将复制粘贴到 Visual Studio 项目中,则代码现在可以编译。