Structured bindings。它们能够声明从元组或结构初始化的多个变量。
此代码使用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
。
我可以将现有变量分配给结构化绑定吗?我需要使用auto
吗?
答案 0 :(得分:9)
您收到的错误消息非常能说明为什么auto
只允许这样做:缺乏歧义会使语法更依赖依赖于上下文。
表达式开头的一对方括号表示lambda。您要问的是标准指定有时 [d2 , i2]
是lambda的开头,它按值捕获d2
和i2
,并且在其他时间它是一个拆包任务。一切都基于其后的内容。
将它添加到语言中并不值得复杂。特别是,自as Some programmer dude noted以来,您已经std::tie
使用元组执行您想要的操作。
不仅如此,std::tie
还允许您忽略一些解压缩的值,结构化绑定尚不支持。所有这一切都归结为有一种更有限的语法糖形式,做标准库已经用元组做的事情。
哦,如果你是std::tie
仅与元组一起工作的不满,你可以将它扩展为自己使用任何POD。看看这个magic_get
implementation。可以将相同的想法应用于constexpr
将POD转换为可以馈送到std::tie
的引用元组。像这样:
std::tie(d2, i2) = magic_unpack(/*some POD that isn't a tuple*/);
答案 1 :(得分:1)
此外,您可以使用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;
}