自C++17以来,C++增加了结构化绑定这个语法,很多人认为它是纯语法糖?只是创建匿名变量引用的语法糖?
其实结构化绑定的实现相当于搞出无名变量来,然后绑定一个个引用。只是标准还额外要求有时这些东西 decltype 出来和引用有点区别,所以它们不是引用。
#include<iostream>
#include<tuple>
auto f() {
return std::tuple(1, 5.6, 7);
}
int main() {
auto [a, b, c] = f();
std::cout << a << ' ' << b << ' ' << c << std::endl;
}
上面这一段代码翻译后是:
#include<iostream>
#include<tuple>
std::tuple<int, double, int> f()
{
return std::tuple<int, double, int>(1, 5.5999999999999996, 7);
}
int main()
{
std::tuple<int, double, int> __f8 = f();
int && a = std::get<0UL>(static_cast<std::tuple<int, double, int> &&>(__f8));
double && b = std::get<1UL>(static_cast<std::tuple<int, double, int> &&>(__f8));
int && c = std::get<2UL>(static_cast<std::tuple<int, double, int> &&>(__f8));
std::operator<<(std::operator<<(std::cout.operator<<(a), ' ').operator<<(b), ' ').operator<<(c).operator<<(std::endl);
return 0;
}
另外还有一个区别就是对于成员全部可访问的类,结构化绑定可以直接指代位域成员,这是引用做不到的。
意思就是引用无法引用位域,但是结构化绑定却可以
#include<iostream>
#include<tuple>
struct T {
uint16_t n : 4;
};
auto f() {
return std::tuple(1, 5.6, 7);
}
int main() {
auto [a, b, c] = f();
std::cout << a << ' ' << b << ' ' << c << std::endl;
T d;
auto& [e] = d;
e = 10;
std::cout << d.n;
}
比如上面这段代码的打印结果就是
1 5.6 7
10
如果只是想学习结构化绑定的使用和概念,可以参考cppref
结构化绑定声明 (C++17 起) - cppreference.comhttps://zh.cppreference.com/w/cpp/language/structured_binding