惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
U
Unit 42
Google DeepMind News
Google DeepMind News
博客园 - 司徒正美
Y
Y Combinator Blog
F
Fortinet All Blogs
云风的 BLOG
云风的 BLOG
T
Tailwind CSS Blog
G
Google Developers Blog
酷 壳 – CoolShell
酷 壳 – CoolShell
罗磊的独立博客
D
DataBreaches.Net
T
The Blog of Author Tim Ferriss
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
MyScale Blog
MyScale Blog
N
Netflix TechBlog - Medium
Microsoft Security Blog
Microsoft Security Blog
GbyAI
GbyAI
P
Proofpoint News Feed
Jina AI
Jina AI
B
Blog RSS Feed
腾讯CDC
阮一峰的网络日志
阮一峰的网络日志
D
Docker

博客园 - 新西兰程序员

C++ 构造函数中的初始化参数列表initializer list C++中的线程thread,以及C++11中的std::atomic学习 Leetcode56 Merge Intervals 合并区间 -- C++实现 C++中的内存对齐 C++中的static关键字使用以及全局变量 C++中的函数参数是指针类型, 是按值传递 C++中异常处理机制中的栈展开stack unwinding C++实现链表反转 Linux中的性能分析工具 perf 来分析C++性能 C++17中新建一个类时,编译器默认生成的类成员函数 QT中的元对象系统 Leetcode 114 - 二叉树展开为链表 Leetcode65 有效数字 - 判断给定的字符串是否是一个有效数字 LettCode2289-Steps to Make Array Non-descreasing C#中的委托详解 C++中的std::function C++中的仿函数Functor C++中的const和constexpr异同比较 C++中的左值和右值,以及右值引用,移动语义 C++中传递参数是指针类型以及传入参数是指针的指针(**)详解 C++中GetTickCount函数学习 C++中以类的成员函数作为Windows callback函数需要设置成static函数 C#中的System.Security.SecureString学习 C++中的悬挂指针和野指针 C++中四种不同的对象生存方式(in stack, in heap, global, local static) C#中使用Parallel类来进行多线程并发编程 String类型转LPCTSTR -----理解C++中的字符串类型转换 C++中的虚函数和虚函数表 C++中基类指针指向派生类对象 数据结构 - 栈的学习
C++17中的结构化绑定Structured Binding
新西兰程序员 · 2026-04-28 · via 博客园 - 新西兰程序员

在C++17这一个里程碑式的版本中,引入了结构化绑定structured binding

结构化绑定structured binding => 结构化绑定允许将一个复合数据类型(如 tuple, pair,map或struct)的多个元素直接绑定到单独的变量上,而无需逐一访问.  结构化绑定在编译期间完成,提供了类型安全和更好的性能

在C++17之前,我们如果需要从函数返回多个值,可以使用tuple,然后用std:tie来获取

std::tuple<int,char,bool> GetTupleValues()
{
     int x = 1;
     char y = 'b';
     bool z = true;

     return std::make_tuple(x,y,z);
     
  
}

int main()
{
      int a;
      char b;
      bool c;

      std::tie(a,b,c) = GetTupleValues();
return 1; }

可以看到,我们用std::tie时,需要已经知道GetTupleValues()返回的每一项分别是什么类型的数据 => 我们定义的a,b,c的类型必须和返回的tuple中的每项类型一一对应.

如果使用C++17中引入的结构化绑定structured binding呢,我们可以直接这样写

auto [a, b, c] = GetTupleValues();

结构化绑定中使用const和&

当绑定到非临时对象时,考虑是否需要引用或常量引用,以避免不必要的拷贝或修改原对象。

#include <iostream>
#include <tuple>

int main()
{
   std::tuple<int, std::string> myTuple = {1,"Test"};
const auto& [id,name] = myTuple; //结构化绑定中使用常量引用
std::cout << "id is " << id << " and name is " << name << std::endl; }

 我们来写一个复杂的例子,来更好的理解数据化绑定

#include <iostream>
#include <tuple>
#include <string>

struct Address {
    std::string street;
    std::string city;
};

struct Person {
    std::string name;
    int age;
    Address addr;
};

int main() {
    Person Luke{"Luke Wu", 35, {"Jianguomen St.", "Beijing"}};
    
    // 直接解构Person
    auto &[name, age, addr] = Luke;
    std::cout << "Name: " << name << ", Age: " << age << '\n';

    // 解构嵌套的Address
    auto &[street, city] = addr;
    std::cout << "Lives at " << street << ", " << city << '\n';

    // 结构化绑定与元组一起使用
    std::tuple<int, std::string, double> info{Luke.age, Luke.name, 165.5};
    auto &[ageRef, nameRef, height] = info;
    std::cout << "Age ref: " << ageRef << ", Name ref: " << nameRef << ", Height: " << height << '\n';

    return 0;
}