为什么结构化绑定只适用于auto

Why structured bindings only work with auto

本文关键字:适用于 auto 绑定 结构化 为什么      更新时间:2023-10-16
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的开头,该lambda按值捕获d2i2,而在其他时候则是一个拆包赋值。所有这些都基于它之后的内容。

把它添加到语言中是不值得的。特别是,正如一些程序员所指出的,你已经有了std::tie可以用元组做你想做的事情。

不仅如此,std::tie还允许您忽略一些未打包的值,这是结构化绑定尚不支持的。因此,这一切都归结为拥有一种更有限的语法糖形式,做一些标准库已经对元组做过的事情。


哦,如果你对std::tie只适用于元组感到不满,你可以自己扩展它来适用于任何POD。看看这个magic_get实现就知道了。可以将相同的思想应用于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;
}