c 17引入了结构化绑定。它们能够声明从元组或结构初始化的多个变量。
此代码使用c 17
编译器进行编译。
#include <iostream>
#include <tuple>
int main() {
auto tuple = std::make_tuple(1.0, 1);
auto [ d, i ] = tuple;
std::cout << "d=" << d << " i=" << i << '\n';
return 0;
}
如果我没有用auto
声明变量,我会得到错误
错误:lambda表达式[d2,i2]的预期主体=元组;
#include <iostream>
#include <tuple>
int main() {
auto tuple = std::make_tuple(1.0, 2);
double d2;
int i2;
[d2 , i2] = tuple;
return 0;
}
我使用了clang version 4.0.0和编译选项-std=c 1z。
我可以将现有变量分配给结构化绑定吗?我需要使用自动
?
此外,还可以使用std::tie()
将元组解压为其各个组件
#include <iostream>
#include <tuple>
int main() {
auto tuple = std::make_tuple(1.0, 1);
double d2;
int i2;
std::tie(d2, i2) = tuple;
std::cout << "d2=" << d2 << " i2=" << i2 << '\n';
return 0;
}
您得到的错误消息非常清楚地表明了为什么只允许auto
:缺乏歧义会使语法更加依赖上下文。
表达式开头的一对方括号表示lambda。您所要求的是标准指定,有时[d2,i2]
是lambda的开始,该lambda按值捕获d2
和i2
,有时是解包分配。所有这些都是基于接下来的内容。
把它添加到语言中是不值得的。特别是,正如一些程序员所指出的,你已经有了std::tie
来处理元组。
不仅如此,std::tie
还允许您忽略一些未打包的值,这是结构化绑定尚不支持的。因此,这一切归结为有一个更有限的语法糖形式,标准库已经对元组做了一些事情。
哦,如果你对std::tie
只适用于元组感到不满,你可以自己扩展它来适用于任何POD。看看这个magic_get
实现。人们可以将同样的想法应用于constepr
将一个POD转换成一个引用元组,该引用元组可以馈送到std::tie
。比如:
std::tie(d2, i2) = magic_unpack(/*some POD that isn't a tuple*/);
我在这里找到了最初的*C结构化绑定方案。它提出了一种轻松绑定多个返回值的方法,即: 但现在我看到每个人都指向 现在我学习了“列表是{like,this}编写的”,出现了一种新的列表语法?为什么?这里的花括号有什么问题?
强制拷贝省略是否适用于通过结构化绑定进行的分解?适用于以下哪种情况? 我怀疑只有第三种情况允许拷贝省略,因为前两种情况将通过
简短版本: 我希望能够将结构转换为元组。至少是那种类型。在下面的代码中,convertToTuple函数不起作用,因为可变参数不能用于结构化绑定(据我所知)。关键是:自动 基本上,我需要的是一种将自定义结构的类型转换为元组的方法,元组包含结构中的所有类型。例如: 具体问题: 我想创建一个模板函数,它将一个类型或一个类型列表作为模板参数,并生成一个纹理列表,每个纹理包含一个项目。另一个函数可以对纹理
我正在学习结构化绑定声明。我的理解是,
这是一个使用ValArray的简单c程序: 如果我像这样编译并运行它: 产出如预期: 但是,如果我像这样编译和运行它: 输出为: 如果使用优化参数,也会发生同样的情况。 GCC版本是(Archlinux最新版本): 但是,如果我尝试叮当,两者 和 产生相同的正确结果: clang版本是: 我还尝试了在Debian上使用GCC 4.9.2,其中可执行文件会产生正确的结果。 这是GCC中可能存在的错误
为什么结构化绑定是通过一个唯一命名的变量和所有模糊的“name is bind to”语言定义的? 我个人认为结构化绑定的工作原理如下。给定一个结构: 以下内容: 大致相当于 数组和元组的等价展开式。但显然,这太简单了,而且有所有这些模糊的特殊语言用来描述需要发生的事情。 很明显,我遗漏了一些东西,但确切的情况是什么,一个定义良好的扩展,比如说,折叠表达式,在标准语言中读起来要简单得多? 似乎结构