结构化绑定是与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声明变量,就会得到错误
错误: d2,i2 =tuple的预期体;
#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吗?
发布于 2017-10-16 07:12:38
您得到的错误消息很好地说明了为什么只允许在auto中使用:缺乏歧义,这会使语法更加依赖上下文。
表达式开头的一对方括号表示lambda。您所要求的是标准指定,有时[d2 , i2]是通过值捕获d2和i2的lambda的开始,而在其他时候则是一个解包分配。都是基于接下来发生的事情。
把它添加到语言中是不值得的。特别是,自从就像一些程序员注意到的以来,您已经有了std::tie来使用元组来做您想做的事情。
不仅如此,std::tie允许您忽略一些未打包的值,这是结构化绑定还不支持的。所以这一切归结为有一种更有限形式的语法糖,去做一些标准库已经用元组所做的事情。
哦,如果你对std::tie只对元组起作用感到不满的话,你可以自己把它扩展到与任何POD一起工作。看看这个实现。我们可以将同样的想法应用于constexpr,将一个std::tie转换成一个引用元组,并将其提供给std::tie。就像这样:
std::tie(d2, i2) = magic_unpack(/*some POD that isn't a tuple*/);发布于 2017-10-16 07:38:48
此外,您还可以使用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;
}https://stackoverflow.com/questions/46764614
复制相似问题