问题标签 [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++ - 为什么结构化绑定不使用`auto&`返回对结构成员的引用,但返回成员本身
我认为使用结构化绑定和auto&
说明符我可以获得对结构成员的引用并直接使用它们而不是通过结构。
但是,以下代码有效并且静态断言成立:
但我认为 C++ 不允许一个变量有多个名称,除非一个是真实变量,而其他变量是引用,但在这种情况下,变量i
是相同的,test.i
并且它们都不是引用。
c++ - 提升 zip-iterator 和结构化绑定
我在搞乱“数组结构”的包装类,最终找到了“boost-iterators”的 zip-iterator。现在我想知道是否有一种方法可以通过迭代生成结果元组,使用结构化绑定,如下面的注释代码段。我发现这篇文章boost::combine,基于范围的 for 和结构化绑定,但这并没有帮助我解决它。
c++ - 在 C++ 中将数组元素解包为多个变量的规则是什么?
我见过这样的代码:
此类作业的规则和适当的术语是什么?
c++ - 字符串到字符串映射上的结构化绑定不起作用
这是我的代码:
当我编译它时,我得到
我做错了什么?不key
应该value
参考string
吗?
c++ - 在 std::map 的 range-for 中的结构化绑定声明中按值获取内置类型
我有:
在哪里Foo
声明的类在别处
我认为有两个问题:
1. 映射类型常量
second
这Foo&
是正确的,但您也可以使用 std::as_const 来实现const Foo&
所以这不是问题。
2.按值拷贝内置类型
first
这const double&
对于内置类型来说是低效的。
有没有办法让first
价值被接受?
我敢肯定这没有被忽视。
c++ - 为什么结构化绑定将变量作为值而不是引用引入?
我正在学习结构化绑定声明。我的理解是,在auto& [x, y] = expr;
变量x
中y
引入了“引用std::tuple_element<i, E>::type
”类型(对于i=0, 1
和E
是不可见变量的类型e
)。此外,这些变量用 初始化get<i>(e)
。
因此,如果我使用auto&
并get<>
返回一个值(不是引用),它不应该编译,因为您不能将左值绑定到临时值。但是,以下示例在 GCC、Clang 和 Visual Studio 的某些版本中为我构建:
此外,C++ Insights清楚地表明,clang 将结构化绑定扩展到:
在这里,它声明x
的不是引用,而是一个值。这是为什么?
我预计左值引用和编译错误:(e
在__f17
上面的示例中)是左值引用。
c++ - 具有自动和结构化绑定的 Ranges V3 zip
我希望能够使用 C++ 范围通过压缩容器来帮助简化代码逻辑,而不是显式索引它们。我可以让它与一个冗长的 lambda 参数一起工作,但我宁愿尝试用 more 使它更简单/可概括auto
。
Ranges-v3文档说明如下:
views::zip
给定N个范围,返回一个新范围,其中第 M 个元素是调用所有N
make_tuple
个范围的第 M 个元素的结果。
这让我认为我应该能够将 转换ranges::common_tuple
为std::tuple
,我查看了公共成员并发现:
但是,这也不能编译:
但是当我打印typeid(v)
它时,它不是std::tuple
;它是ranges::common_tuple
。我在这里尝试做的auto
类型推断是否可行?(如果重要的话,编译器)
c++ - 到数组元素的结构化绑定
当左侧是对数组成员的引用时,结构化绑定的正确语法是什么?
例如,以下程序无法编译:
给出错误
如果结构化绑定写为
visual-studio - c++17 语言扩展和 std:c++17 标志
我对 Visual Studio 2017(版本 15.9.11)中的不同错误感到困惑:
和
我知道添加 /std:c++17 标志可以解决这些问题,但为什么会有两条不同的消息?语言扩展和编译器标志要求有什么区别?
我对这件事更感兴趣,因为我正在使用 Unreal Engine 4.24 编写游戏,我可以使用“if constexpr”,但即使使用相同的编译器,我也不能使用“结构化绑定”。
为什么?
c++ - 在基于范围的 for 循环中使用结构化绑定声明
我正在尝试将两个std::map
容器(例如std::map<int, int> foo, bar
)组合成第三个容器(std::map
例如std::map<int, int> foobar
)。
我知道我可以使用迭代器来实现这一点,如下所示:
但是我如何使用基于范围的 for 循环(也许,结合结构化绑定声明)来实现相同的效果?
或者有没有更好的方法来组合这两个关联容器?
编辑:这个问题的预期答案应该采用两个容器(std::map
此处)并将它们组合成一个联合/联合映射,其中键来自各自的关联容器和添加的重复键的值。
示例:
如果给定std::map
容器foo
并且bar
是:
那么 `foobar' 应该是:
这一切都在一个基于 Range 的 for 循环中完成。