问题标签 [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++ - 不可能与现有变量进行结构化绑定?
是否可以使用已经存在的变量作为返回值的目标structured bindings
?
c++ - 结构化绑定的函数声明
结构化绑定只能与某种“结构”一起使用作为返回值吗?
归还任何类/结构,例如这里的元组可以正常工作:
有没有什么东西可以实现:
c++ - 结构化绑定的用例是什么?
C++17 标准引入了一个新的结构化绑定特性,该特性最初是在 2015 年提出的,其语法外观被广泛讨论。
浏览文档后,您会立即想到它们的一些用途。
聚合分解
让我们声明一个元组:
使用结构化绑定可以很容易地在一行中获得命名的元素副本:
这相当于:
或者
对元组元素的引用也可以轻松获得:
所以我们可以使用所有成员都是公共的数组或结构/类。
多个返回值
一种从函数中获取多个返回值的便捷方法紧随其后。
还有什么?
您能否为结构化绑定提供一些其他可能不太明显的用例?它们还能如何提高 C++ 代码的可读性甚至性能?
笔记
正如评论中提到的,结构化绑定的当前实现缺乏一些特性。它们是非可变的,它们的语法不允许显式跳过聚合成员。在这里可以找到关于可变性的讨论。
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 发生?
c++ - 可以在多态 lambda 中使用结构化绑定语法吗
结构化绑定使遍历具有基于范围的 for 循环的地图更加清晰和可读,如下所示
但是结构化绑定可以在如下 lambda 表达式中使用吗?
从看起来上面的代码不适用于我在这里找到的在线 C++ 编译器https://wandbox.org/permlink/sS6r7JZTB3G3hr78。
如果它不起作用,那么是否有充分的理由不支持上述内容?还是只是尚未提出的东西?模板只会在使用时被实例化,因此结构化绑定的“解除绑定”过程可以发生在请求实例化的地方(即调用函数时)
c++ - 复制省略是否适用于结构化绑定
强制复制省略是否适用于通过结构化绑定进行的分解?这适用于以下哪些情况?
我怀疑只有第三种情况允许复制省略,因为前两种情况将通过std::get<>
and “分解”,std::tuple_size<>
并std::get<>
在参数为右值时返回 xvalues
来自标准的报价也很好!
c++ - 为类提供类似元组的结构化绑定访问
我正在尝试支持类的类似元组的结构化绑定访问。为简单起见,我将在本文的其余部分使用以下类:
(我知道这个类支持开箱即用的结构化绑定,但我们假设它不支持。)
要启用对 的成员的类似元组的访问Test
,我们必须专门化std::tuple_size
和std::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
不适用于结构化绑定的任何想法?
c++ - 使用结构绑定更改自定义结构的值
我正在尝试找到一种方法来使用结构化绑定更改自定义结构的值。我能够做到这一点。我从结构化绑定std::map
中引用了一些材料
在下面的代码中,我能够更改 map 的值。我想将unsigned salary
默认值 1000 更改为 10000
输出
改变我试图得到预期的输出
我得到的错误
无法使用 const 限定类型“const int”分配给变量“salary”
预期产出
提前感谢您的任何解决方案和建议
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.任何建议如何解决上述示例的错误
c++ - 为什么基于范围的 for 循环中的结构化绑定只是副本而不是引用?
我有以下代码:
我的问题:
为什么第一个断言语句没有通过而第二个通过?为什么我不能在基于范围的 for 循环中更改地图中 afoo
的值?foos
编译器: MSVS++17 Visual Studio 15.3.2
编辑:如果将复制粘贴到 Visual Studio 项目中,则代码现在可以编译。