首页 > 后端开发 > C++ > 正文

c++17的结构化绑定是什么 同时声明和初始化多个变量【语法糖】

穿越時空
发布: 2025-12-18 08:04:50
原创
639人浏览过
结构化绑定是C++17引入的语法糖,支持std::tuple、std::pair、原生数组、聚合类(如struct Point)和std::array等类型;语法为auto [a, b, c] = expr;,默认绑定为值,auto& [a, b]为引用,const auto&最常用;相比传统std::get冗长写法更简洁高效。

c++17的结构化绑定是什么 同时声明和初始化多个变量【语法糖】

结构化绑定是C++17引入的语法糖,允许你从一个结构化对象(如结构体、数组、tuple等)中**一次性解包多个成员,并直接声明和初始化对应变量**,无需手动逐个访问成员或写冗长的代码。

能用在哪些类型上?

只要对象满足“可结构化绑定”的条件,就能用。常见支持类型包括:

  • 标准容器:std::tuplestd::pair
  • 原生数组:int arr[3]
  • 聚合类(aggregate class):没有用户定义构造函数、私有/受保护非静态成员、基类、虚函数的struct/class
  • 某些标准库类型(如std::array,因其实质是聚合类)

基本语法怎么写?

auto [a, b, c]这种形式,方括号里是新变量名,左边用auto或显式类型(需匹配),右边是可绑定的表达式:

auto [x, y] = std::make_pair(1, 3.14);     // x:int, y:double
auto [a, b, c] = std::array{10, 20, 30};   // a,b,c 都是 int
struct Point { int x; double y; };
Point p{42, 2.718};
auto [px, py] = p;  // px:int, py:double —— 直接按声明顺序绑定
登录后复制

注意几个关键细节

结构化绑定不是“拷贝成员”,而是创建对原对象成员的引用(默认是const引用或值,取决于左侧声明):

立即学习C++免费学习笔记(深入)”;

Fotor AI Image Upscaler
Fotor AI Image Upscaler

Fotor推出的AI图片放大工具

Fotor AI Image Upscaler 73
查看详情 Fotor AI Image Upscaler
  • auto [a, b] → 绑定为值(可能触发拷贝)
  • auto& [a, b] → 绑定为左值引用(可修改原对象成员)
  • const auto& [a, b] → 绑定为const左值引用(最常用,避免不必要拷贝)
  • 不能绑定到位域、static成员、或不可访问的私有成员(除非是友元或public)

和传统写法对比更直观

以前要这样写:

auto t = std::make_tuple("hello", 42, 3.14);
std::string s = std::get<0>(t);
int i = std::get<1>(t);
double d = std::get<2>(t);
登录后复制

现在一行搞定:

auto [s, i, d] = std::make_tuple("hello", 42, 3.14);
登录后复制

不仅简洁,变量名语义清晰,编译器还能做更好的优化。

以上就是c++++17的结构化绑定是什么 同时声明和初始化多个变量【语法糖】的详细内容,更多请关注php中文网其它相关文章!

c++速学教程(入门到精通)
c++速学教程(入门到精通)

c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号