Structured bindings已经引入了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
。
我可以将现有变量分配给结构化绑定吗?我需要使用auto
吗?
你得到的错误信息很好地说明了为什么它只允许使用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*/);
此外,您可以使用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;
}