C++17 结构化绑定

目录

结构化绑定 (structured bindings) 更方便地访问和操作容器中的元素

struct MyStruct {
    int num = 0;
    std::string str;
};
MyStruct ms;
// 下列每一种声明方式都是支持的
auto [num1, str1] = ms;
auto const [num2, str2] {ms};
auto & [num3, str3] (ms);
auto const & [num3, str3] (ms);

本质:引入一个隐藏的匿名对象

  • 结构化绑定时引入的新变量名其实都指向一个匿名对象的成员/元素。
/* 结构化绑定:值 */
auto [u, v] = ms;
auto const [u, v] = ms;
// 等价于
// 1. 拷贝一个新的匿名对象
auto e = ms;
// 2. 让u和v变成新的匿名对象的成员变量的别名
取别名 u = e.i; // 注意,这里不是引用,实际上相当于编译器帮我们取别名了
取别名 v = e.s;

/* 结构化绑定:引用 —— 可间接修改用于初始化的对象的成员 */
auto & [u, v] = ms;
auto const & [u, v] = ms;
// 等价于
// 1. 新的匿名对象是原始对象引用
引用ms 得到 e
// 2. 让u和v变成新的匿名对象的成员变量的别名
// 等价于
取别名 u = e.i; // 注意,这里不是引用,实际上相当于编译器帮我们取别名了
取别名 v = e.s;
  • 修饰符会作用在新的匿名实体上,而不是结构化绑定引入的新的变量名上。
const auto& [u, v] = ms; // u/v 指向 ms.i/ms.s
// u和 v都不是引用,只有匿名实体是一个引用
// 根据我们的推导,decltype(u)是 const int,decltype(v)是 const std::string
// 变成了 const的 —— 因为不能修改常量引用的成员
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值