首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么结构化绑定不使用` `auto&`返回对结构成员的引用,而返回成员本身

结构化绑定是C++17引入的一种语法特性,用于方便地从复杂的数据结构中提取成员变量。它允许我们通过一条语句将结构体或类的成员变量绑定到命名的变量上,从而可以直接使用这些变量而不需要通过成员访问运算符来访问。

在结构化绑定中,我们可以使用auto关键字来推导成员变量的类型,并使用引用来绑定成员变量。然而,为什么结构化绑定不使用auto&返回对结构成员的引用,而返回成员本身呢?

这是因为结构化绑定的设计初衷是为了提供一种方便的方式来访问成员变量,并且保持代码的简洁性和可读性。如果结构化绑定返回对结构成员的引用,那么在使用结构化绑定的代码中,我们需要显式地使用引用来声明变量,这会增加代码的复杂性和理解难度。

另外,结构化绑定返回成员本身而不是引用还可以避免潜在的问题。如果返回对结构成员的引用,那么在绑定后,如果原始结构体或类的成员发生了变化,那么绑定的引用也会随之改变。这可能导致一些意外的行为和错误,特别是在多线程环境下。

因此,结构化绑定不使用auto&返回对结构成员的引用,而返回成员本身,以保持代码的简洁性、可读性和避免潜在的问题。

腾讯云相关产品和产品介绍链接地址:

  • 腾讯云云服务器(CVM):https://cloud.tencent.com/product/cvm
  • 腾讯云云数据库 MySQL 版:https://cloud.tencent.com/product/cdb_mysql
  • 腾讯云云原生容器服务(TKE):https://cloud.tencent.com/product/tke
  • 腾讯云人工智能平台(AI Lab):https://cloud.tencent.com/product/ai
  • 腾讯云物联网平台(IoT Hub):https://cloud.tencent.com/product/iothub
  • 腾讯云移动开发平台(MTP):https://cloud.tencent.com/product/mtp
  • 腾讯云对象存储(COS):https://cloud.tencent.com/product/cos
  • 腾讯云区块链服务(BCS):https://cloud.tencent.com/product/bcs
  • 腾讯云元宇宙平台(Tencent XR):https://cloud.tencent.com/product/xr
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

【C++新特性】C++17结构化绑定

MyStruct ms; auto [u, v] = ms; 在这里,u和v就是所谓结构化绑定。将结构成员分解初始化了u、v变量。 结构化绑定对于返回结构或数组函数特别有用。...,由返回值进行初始化,不是直接绑定返回本身。...1.1.3 修饰符并非修饰结构化绑定 修饰符修饰是匿名变量,不是结构化绑定。尽管在结构化绑定时候会使用到auto,但是结构化绑定类型不会退化(数组转指针、修饰符被忽略等)。...std::tuple_element::type 返回第idx个元素类型 一个全局或成员函数get()返回idx个元素使用时候需要元素或数据成员数量必须匹配结构化绑定名字个数...()调用返回值,使用结构化绑定使代码可读性更强,可以更加清晰表达自己一图,不是依赖与std::pairfirst与second。

7K53

聊聊结构化绑定

动机 std::mapinsert方法返回std::pair,两个元素分别是指向所插入键值迭代器与指示是否新插入元素布尔值,std::map::type,则结构化绑定vi类型是Ti引用;当get返回左值引用时是左值引用,否则是右值引用;被引类型为Ti;——decltype结构化绑定有特殊处理,产生被引类型,在类元组情形下结构化绑定类型与被引类型是不同...;•数据成员情形,与数组类似,设数据成员mi被声明为Ti类型,则结构化绑定类型是指向cv Ti左值(同样不是左值引用);被引类型为cv Ti。...至此,我想“结构化绑定意义已经明确了:标识符总是绑定一个对象,该对象是另一个对象成员(或数组元素),后者或是拷贝或是引用引用不是对象,意会即可)。...与引用类似,结构化绑定都是既有对象别名(这个对象可能是隐式);与引用不同,结构化绑定不一定是引用类型。

28710
  • 结构化绑定

    MyStruct ms; auto [u, v] = ms; 在这里,u和v就是所谓结构化绑定。将结构成员分解初始化了u、v变量。 结构化绑定对于返回结构或数组函数特别有用。...,由返回值进行初始化,不是直接绑定返回本身。...1.1.3 修饰符并非修饰结构化绑定 修饰符修饰是匿名变量,不是结构化绑定。尽管在结构化绑定时候会使用到auto,但是结构化绑定类型不会退化(数组转指针、修饰符被忽略等)。...std::tuple_element::type 返回第idx个元素类型 一个全局或成员函数get()返回idx个元素使用时候需要元素或数据成员数量必须匹配结构化绑定名字个数...()调用返回值,使用结构化绑定使代码可读性更强,可以更加清晰表达自己一图,不是依赖与std::pairfirst与second。

    89920

    C++17常用新特性(三)---结构化绑定

    值得注意是,他们并不是引用关系,如果在结构化绑定之后重新data1进行赋值,u1和v1值是不是随之改变。...: 0,Hello World 修改数据之后[u,v]和stTmp值变化: 0,Hello World 3,哈,来模仿我呀 运行结果也证明了上述结论:结构化绑定只是结构体对象值进行拷贝,不是引用关系...: 3.2 原生数组 原生数组使用结构化绑定时需要注意是只有在数组长度一定情况下才能使用结构化绑定,且声明对象个数要和数组长度保持一致。...non-const 引用进行绑定时,还能够返回数组元素进行修改: std::array stdArr { 1, 2, 3, 4 }; auto& [a, b, c, d] = stdArr...不得不说结构化绑定确实帮助我们可以直接操作结构体定义变量,提升了代码可读性,但是从某方面说这一操作又有很多局限性,如结构化绑定时声明对象必须和绑定对象数量一致、绑定时要求非静态成员变量必须统一在父类或者子类中进行定义等

    1.7K20

    深入解析C++auto自动类型推导

    = 2.0; // 编译错误,i为int,j为double 规则二:形式如auto&或auto*,表示定义引用或者指针 当定义变量时使用auto&或auto*类型修饰,表示定义是一个引用类型或者指针类型...(2)语句中auto被推导为const int,ci类型为const int &,因为ci是cx引用cx是一个const修饰常量,因此引用也必须是常量引用。...p1 < p2; } 避免类型硬编码 除了上面提到可以减少代码冗余之外,使用auto也可以避免类型硬编码,也就是说写死变量类型,让编译器自动推导,如果我们要修改代码,就不用去修改相应类型...结构化绑定功能(C++17) C++17标准中auto还支持了结构化绑定功能,这个功能有点类似tuple类型tie函数,它可以分解结构化类型数据,把多个变量绑定结构化对象内部对象上,在没有支持这个功能之前...,这样可以让我们省略了需要先声明变量再处理结构化对象麻烦,特别是在for循环中遍历容器时,如下: std::map m; for (auto& [k, v] : m

    22520

    C++一分钟之-C++17特性:结构化绑定

    本文将深入浅出地介绍结构化绑定基本概念、常见应用场景、易错点及避免策略,并通过代码示例加以说明。一、什么是结构化绑定?...解构std::tuple和std::pair这是结构化绑定最直观应用场景,特别是处理多返回情况。2....使用const和&当绑定到非临时对象时,考虑是否需要引用或常量引用,以避免不必要拷贝或修改原对象。...结构化绑定与匿名类型C++17允许结构化绑定匿名类型,但需谨慎使用,以免代码难以理解。...示例:auto [a, b] = std::make_tuple(1, 2); // 匿名类型,仅在简单情况下使用五、代码示例:深入理解下面的例子展示了如何在更复杂场景下使用结构化绑定,包括嵌套结构体和元组解构

    19810

    C++一分钟之-C++17特性:结构化绑定

    本文将深入浅出地介绍结构化绑定基本概念、常见应用场景、易错点及避免策略,并通过代码示例加以说明。 一、什么是结构化绑定?...解构std::tuple和std::pair 这是结构化绑定最直观应用场景,特别是处理多返回情况。 2....使用const和& 当绑定到非临时对象时,考虑是否需要引用或常量引用,以避免不必要拷贝或修改原对象。...结构化绑定与匿名类型 C++17允许结构化绑定匿名类型,但需谨慎使用,以免代码难以理解。...示例: auto [a, b] = std::make_tuple(1, 2); // 匿名类型,仅在简单情况下使用 五、代码示例:深入理解 下面的例子展示了如何在更复杂场景下使用结构化绑定,包括嵌套结构体和元组解构

    15210

    C++20新特性个人总结

    默认可构造可分配无状态lambdas  2.13  专门访问检查  2.14  constexpr函数实例化  2.15  允许lambda在初始化捕获时进行包扩展  2.16  放宽结构化绑定...requires,concept结合requires之后,模板类型参数约束可以细致到类型成员变量、类型成员函数甚至其返回值等等。 ...,新增自定义查找规则  这个特性比较地牛逼了,以前结构化绑定限制比较多,现在放宽了限制,并且可以自定义绑定第几个是哪个类型,而且可以指定解绑个数。 ...value1;         else if constexpr (N == 1)             return a;     } }; namespace std  {     // 指定X类型结构化绑定个数为...指向成员指针类型,且引用相同成员,或者都是空成员指针值;  ⑦引用类型,且引用相同对象或函数;  ⑧数组类型,对应元素满足模板参数等效;  ⑨共用体类型,或者都没有活动成员,或者都具有相同活动成员

    1.9K50

    C++17 在业务代码中最好用十个特性

    语法糖 这里所说语法糖,并不是严格意义上编程语言级别的语法糖,还包括一些能让代码更简洁更具有可读性函数和库: 结构化绑定 c++17 最便利语法糖当属结构化绑定。...结构化绑定是指将 array、tuple 或 struct 成员绑定到一组变量*上语法,最常用场景是在遍历 map/unordered_map 时不用再声明一个中间变量了: // pre c++17...// c++17 for(const auto& [key, value]: map){   // ... } *: 严格来说,结构化绑定结果并不是变量,c++标准称之为名字/别名,这也导致它们不允许被... " << value << std::endl;     }(); } 另外这条限制在 c++20 中已经被删除,所以在 c++20 标准中 gcc 和 clang 都可以捕获结构化绑定对象了。...只有当类型完全未知情况下,才应当使用std::any,比如动态类型文本解析或者业务逻辑中间层信息传递。

    2.6K20

    C++中auto关键字用法详解

    2.auto使用细则 auto与指针和引用结合起来使用 用auto声明指针类型时,用auto和auto*没有任何区别,但用auto声明引用类型时则必须 加& int main() { int x...下面详细介绍这些更新: C++14中auto更新 返回类型推导: 在C++14中,auto可以用于推导普通函数返回类型。...这意味着你可以在函数定义时使用auto关键字指定返回类型,编译器会根据返回语句推导出具体类型。这样做可以增加代码可读性和灵活性,特别是在模板编程和使用lambda表达式时。...示例: auto genericAdd = [](auto x, auto y) { return x + y; }; C++17中auto更新 类成员初始化: C++17允许在类中使用auto...在实例化时,N类型会根据提供常量自动推导。 结构化绑定: C++17还引入了结构化绑定,这允许使用auto来解构数组、结构体和tuple,从而更容易地访问复合数据类型元素。

    27310

    c++17好用新特性总结

    结构化绑定 c++17最便利语法糖当属结构化绑定。...结构化绑定是指将array、tuple或struct成员绑定到一组变量*上语法,最常用场景是在遍历map/unordered_map时不用再声明一个中间变量了: // pre c++17 for(...++17 for(const auto& [key, value]: map){ // ... } 需要注意是,结构化绑定结果并不是变量,c++标准称之为名字/别名,这也导致它们不允许被lambda...::cout << key << ": " << value << std::endl; }(); } 但是这条限制在c++20中已经被删除,所以在c++20标准中gcc和clang都可以捕获结构化绑定对象了...bool 表达式不能用 ++, – 这两个自增(减)运算符了 c++17中异常已经成为了类型系统一部分, 枚举直接列表初始化 结构化绑定 constexpr if 表达式

    3.2K10

    C++17常用新特性

    2 C++17新特性 2.1 折叠表达式 从C++17开始,可以使用二元操作符形参包中参数进行计算,这一特性主要针对可变参数模板进行提升,可以分为左折叠和右折叠。支持二元操作符多达32个。...C++17支持类型包括:左值引用,整数,指针类型,成员指针类型,枚举。...int main() { float sum1 = sum(5); std::cout<<"sum1="<<sum1<<std::endl; return 0; } 2.6 <em>结构化</em><em>绑定</em>...std::tuple tpl(x,std::move(y),z); const <em>auto&</em> [a,b,c] = tpl; // a 指名指代 x <em>的</em><em>结构化</em><em>绑定</em>;decltype...(a) 为 float& // b 指名指代 y <em>的</em><em>结构化</em><em>绑定</em>;decltype(b) 为 char&& // c 指名指代 tpl <em>的</em>第 3 元素<em>的</em><em>结构化</em><em>绑定</em>;decltype(c) 为 const

    2.3K20

    常见c和cpp面试题目汇总(一)

    一、C和C++区别: 1、C是面向过程语言,是一个结构化语言,考虑如何通过一个过程输入进行处理得到输出;C++是面向对象语言,主要特征是“封装、继承和多态”。...;引用只是一个别名,还是变量本身引用任何操作就是变量本身进行操作,以达到修改变量目的 2、引用只有一级,指针可以有多级 3、指针传参时候,还是值传递,指针本身值不可以修改,需要通过解引用才能对指向对象进行操作...只有虚函数才使用是动态绑定,其他全部是静态绑定 十五、引用是否能实现动态绑定为什么引用可以实现: 可以。...函数一旦结束,形参生命也宣告终结,做出修改一样没任何变量产生影响。 用引用作为返回值最大好处就是在内存中产生被返回副本。 但是有以下限制: 1)不能返回局部变量引用。...例如,被函数返回引用只是作为一 个临时变量出现,没有被赋予一个实际变量,那么这个引用所指向空间(由new分配)就无法释放,造成memory leak 3)可以返回成员引用,但是最好是const

    1.3K31

    C++中auto关键字用法

    函数返回类型推导(C++14+): C++14 引入了函数返回类型自动推导,允许在函数定义中使用 auto 作为返回类型占位符。...auto add(int a, int b) { return a + b; // 返回类型为 int } 5. 复杂类型推导: auto 还可以与其他类型一起使用,进行复杂类型推导。...结构化绑定(C++17+): C++17 引入了结构化绑定(structured bindings),可以与 auto 一起使用,方便地访问容器、元组等成员。...注意事项: auto 并不是一种动态类型,而是在编译时确定。变量类型在初始化时就已经确定。 在函数参数、非静态成员变量、数组等地方不能使用 auto。...然而,在使用时需要谨慎,避免过度使用,尤其是在函数接口和公共代码中。在这些情况下,明确类型声明更有助于代码可理解性和可维护性。

    45210

    【C++修炼之路】18.map和set

    等,这些容器统称为序列式容器,因为其底层为线性序列数据结构,里面存储是元素本身。...键值: 用来表示具有一一应关系一种结构,该结构中一般只包含两个成员变量key和value,key代表键值,value表示与key对应信息。...树形结构关联式容器: 根据应用场景桶,STL总共实现了两种不同结构管理式容器:树型结构与哈希结构。**树型结构关联式容器主要有四种:map、set、multimap、multiset。...也有唯一容器:multiset,multiset只排序不去重,下面讲这个时候会知道返回位置是中序遍历第一个。...如果把70变成75,itup同样会得到80位置,所以upper_bound返回是大于该位置边界,可以对标end(),lower_bound标begin,返回是大于等于边界。

    72600

    C++:map和set认识和简单使用关联式容器

    序列式容器也就是vector、list、queue等容器,因为其底层为线性序列数据结构,里面存储是元素本身。...键值 用来表示具有一一应关系一种结构,该结构中一般只包含两个成员变量key和value,key代表键值,value表示与key对应信息。...map则是拥有键值,在底层实现中,键值key和值value类型可能不同,并且在map内部,key与value通过成员类型value_type绑定在一起,为其取别名称为pair: typedef...中,键值key通常用于排序和唯一地标识元素,值value中存储与此键值key关联内容,key与value使用pair绑定起来。...]用默认value与key构造键值然后插入,返回改默认value,at()则是直接抛异常。

    53210

    【C++STL】map和set介绍

    今日更新了map和set相关内容 欢迎大家关注点赞收藏⭐️留言 关联式容器 vector、list、deque等这些容器统称为序列式容器,因为其底层为线性序列数据结构,里面存储是元素本身...关联式容器也是用来存储数据,与序列式容器不同是,其里面存储结构键值,在数据检索时比序列式容器效率更高。...键值key和值value类型可能不同,并且在map内部,key与value通过成员类型 value_type绑定在一起,为其取别名称为pair。...所以这里用法跟前面list模拟很像。 注意上面传引用比较好,这样就不会因为进行深拷贝,导致效率低下。 operator[] 上面的写法太过麻烦,可以使用[]。...[]底层实现,就有了其他用法: operator[]本质:给[]一个Key,如果存在,就返回Key对应val引用

    7410

    c++ map和set_STLset和map区别

    ,如:vector、list、deque等,这些容器统称为序列式容器,因为其底层为线性序列数据结构,里面存储是元素本身 关联式容器:关联式容器也是用来存储数据,与序列式容器不同是,其里面存储是...哈希结构 哈希表,哈希桶 二、键值 概念: 用来表示具有一一应关系一种结构,该结构中一般只包含两个成员变量key和value,key代表键值,value表示与key对应信息 示例:...键值key和值value类型可能不同,并且在map内部,key与value通过成员类型value_type绑定在一起,为其取别名称为pair:typedef pair value_type;...(红黑树) 注:set和map基本差不多,但是set是k模型,map是kv模型,这导致在部分地方又有些不一样 2、map使用 map模板参数说明: 解释: key: 键值中key...找到与key对应value然后返回引用,当key不存在时,operator[]用默认value与key构造键值然后插入,返回该默认value 示例:做统计 void testmap3() {

    41120

    Modern c++快速浅析

    bool>(result[2]); [c++中为什么不提倡使用vector?]...int&,但是由于使用模板类型推导,返回类型将会是int,而在C++中右值进行赋值是非法,因此会编译失败。...Lambda表达式 Lambda表达式其实是块语法糖,其结构如下 [函数对象参数](函数参数列表) mutable throw(类型)->返回值类型 { 函数语句 }; •当捕获是this时,lambda...函数体中与其所在成员函数有着相同protected,private访问权限•除了引用捕获外,其他各种捕获都会默认加上const修饰符,mutable关键字可以解决这个问题(如果匿名函数体中发生按值捕获变量修改...,那么修改是拷贝不是值本身)void func(int& num) { } void const_capture() { int data = 20; // 编译出错 无法将const int

    17910

    STL中有哪些副作用或稍不注意会产生性能开销地方?

    并且这里引用还是引用临时对象! 但如果你使用auto&则不会出问题。编译器自动类型识别会帮你处理好!...而且我鼓励在生产环境中使用会抛异常函数。因为C++不同于java。java如果有未捕获或throw异常,编译都过不了。C++则不管。...直接修改类定义方法,则老代码透明。 如果要排序,不要无脑使用sort() 如果你想着拥有N个元素vector排序,然后取出K个元素。那么这是典型TopK问题。不要无脑使用sort()。...for (auto& e: v) { // do sth for e ... } 但是有时候我们在循环内需要下标信息,不仅仅是元素本身。所以就变成传统下标遍历了。...next()表示向右移动虚拟迭代器,并返回其值,所以我定义了一个成员变量i,初始化为-1。

    1.3K10
    领券