自C++17以来,C++增加了结构化绑定这个语法,很多人认为它是纯语法糖?只是创建匿名变量引用的语法糖?
其实结构化绑定的实现相当于搞出无名变量来,然后绑定一个个引用。只是标准还额外要求有时这些东西 decltype 出来和引用有点区别,所以它们不是引用。
- #include
- #include
-
- auto f() {
- return std::tuple(1, 5.6, 7);
- }
- int main() {
- auto [a, b, c] = f();
- std::cout << a << ' ' << b << ' ' << c << std::endl;
- }
上面这一段代码翻译后是:
- #include
- #include
-
- 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
int, double, int> &&>(__f8)); - double && b = std::get<1UL>(static_cast
int, double, int> &&>(__f8)); - int && c = std::get<2UL>(static_cast
int, double, int> &&>(__f8)); - std::operator<<(std::operator<<(std::cout.operator<<(a), ' ').operator<<(b), ' ').operator<<(c).operator<<(std::endl);
- return 0;
- }
另外还有一个区别就是对于成员全部可访问的类,结构化绑定可以直接指代位域成员,这是引用做不到的。
意思就是引用无法引用位域,但是结构化绑定却可以
- #include
- #include
- 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