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

c++11很难理解为什么我不能统一初始化一个结构,但我可以初始化一个类似类型的std::对

C++11引入了统一初始化语法,允许我们使用花括号{}来初始化对象。然而,对于结构(struct)类型的对象,有时候可能会遇到一些限制。

在C++中,结构(struct)和类(class)是非常相似的,它们都可以用来定义自定义的数据类型。然而,结构和类之间有一个重要的区别:默认的访问权限。在结构中,默认的访问权限是公共的(public),而在类中,默认的访问权限是私有的(private)。

当我们使用统一初始化语法初始化一个结构类型的对象时,编译器会尝试使用聚合初始化(aggregated initialization)的方式来完成初始化。聚合初始化要求结构的所有成员都是公共的(public),否则会导致编译错误。

然而,对于类(class)类型的对象,由于默认的访问权限是私有的(private),所以无法使用聚合初始化的方式来初始化对象。为了解决这个问题,C++11引入了初始化列表(initializer list)的概念,允许我们在类的构造函数中使用花括号{}来初始化成员变量。

对于std::对类型的对象,它是一个类(class)类型,而不是结构(struct)类型。因此,我们可以使用初始化列表(initializer list)来初始化std::对类型的对象。

总结起来,C++11引入了统一初始化语法,允许我们使用花括号{}来初始化对象。对于结构(struct)类型的对象,需要满足聚合初始化的要求,即所有成员都是公共的(public)。对于类(class)类型的对象,可以使用初始化列表(initializer list)来初始化成员变量。而std::对类型是一个类(class)类型,因此可以使用初始化列表来初始化。

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

  • 腾讯云C++ SDK:https://cloud.tencent.com/document/product/876
  • 腾讯云云服务器(CVM):https://cloud.tencent.com/product/cvm
  • 腾讯云云数据库MySQL版:https://cloud.tencent.com/product/cdb_mysql
  • 腾讯云云原生容器服务:https://cloud.tencent.com/product/tke
  • 腾讯云人工智能平台:https://cloud.tencent.com/product/ai
  • 腾讯云物联网平台:https://cloud.tencent.com/product/iotexplorer
  • 腾讯云移动开发平台:https://cloud.tencent.com/product/mwp
  • 腾讯云对象存储(COS):https://cloud.tencent.com/product/cos
  • 腾讯云区块链服务:https://cloud.tencent.com/product/bcs
  • 腾讯云元宇宙服务:https://cloud.tencent.com/product/mu
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

C++17中新特性

但是,C++11auto推导,往往结果与预期不同。 c++11 中为了支持统一初始化,引入了新统一初始化语法,如下所示。...,值不存在时则抛出 std::bad_optional_access 异常 value_or() // 值存在时返回值,不存在时返回默认值 3. std::any 一个类型安全可以保存任何值容器...4. std::string_view string_view最早使用是boost版本,c++17中string_view 和 boost类似。...string_view可以理解成原始字符串一个只读引用。 string_view 本身没有申请额外内存来存储原始字符串data, 仅仅保存了原始字符串地址和长度等信息。...bool 表达式不能用 ++, -- 这两个自增(减)运算符了 c++17中异常已经成为了类型系统一部分, 枚举直接列表初始化 结构化绑定 constexpr if 表达式 map支持merge和extract

4.9K30

【笔记】《深入理解C++11》(上)

0 绪 本篇是看完《深入理解C++11C++11新特性解析与应用》后做笔记上半部分....理解这个初衷就能理解C++11很多新内容设计缘由 核心改进点: 并行编程: 内存模型, 线程, 原子操作 泛型编程: 统一初始化表达式, auto, decltype, move 系统编程: constexpr...regex, 库尽量以头文件实现, 但也有并行库这种必须深入编译器库 用通用而非特殊手段来实现特性: 显式类型转换 让特性专家和新手都适用: 统一初始化表达式 增强类型安全: enum class...新手易学, 老兵易用 auto auto是静态类型推导, 必须被初始化 auto本质上是一个类型占位符, 在编译时候推导出类型然后以类似字面替换方式进行使用 auto和cv限制符(cv-qualifier...auto类型推导式从左到右进行, 由于类似字符替换特性, 表达式auto t = 1, &r = t, *p = &r;是合法 auto不能作为形参类型, 需要泛型时候还是应该用模板处理

1.9K20
  • 【C++】C++11常用特性总结

    一、统一列表初始化 1.统一{}初始化 1....然而在C++11中,扩大了{}列表初始化范围,使其能够初始化所有的自定义类型和内置类型,实现统一列表初始化{},并且在初始化时候,如果不想写=赋值符号,也可以将其省略,只保留{}花括号列表。...列表初始化当然也可以用在new开空间时候,例如p2指针指向空间在开辟时候,内部元素被初始化为0,p3结构体指针指向结构体数组也可以统一列表进行初始化。...* t2结果类型定义出一个变量ret,但我们不清楚t1和t2是什么类型,我们不能单独用t1或t2类型定义出变量ret。...//但其实array也没啥用,虽然比C语言普通数组多了越界检查,但既然已经有了vector,那为什么还要用你array呢? //vectoroperator[]也可以检查越界啊!

    80340

    【C++】C++11新特性 --- 列表初始化,auto关键字,decltype关键字

    接下来将通过几篇文章来介绍一下C++11中重要特性! 2 列表初始化C++11中加入了initializer_list标准库类型,用于表示某种特定类型数组。...Point p = { 2 , 33 }; return 0; } 这里是多参数隐式类型转换,类似之前单参数隐式类型转化。...不能用来声明对象 decltype:是用来声明变量,他可以推断变量类型可以用来声明 std::map::const_iterator it1 = dict.begin...如果auto调用了多层,就很难确定一个变量类型,让代码可读性变得很差!让代码维护变得更加困难!所以使用中要谨慎使用!!!...4 STL中新容器 4.1 array 这是一个静态数组,可以初始化中就确定数组大小,越界检查比int arr[]更加严格。但是其在实际使用中并不实用,因为vector完全可以替代!

    9010

    C++11C++11新纪元:深入探索右值引用与移动语义

    统一列表初始化C++11及以后版本中,引入了统一列表初始化(Uniform Initialization)或称为初始化列表(Initialization List),这是一种新初始化语法,...统一列表初始化不仅提高了代码一致性和可读性,还解决了之前初始化语法中一些歧义和限制 { }初始化 在C++98中,标准允许使用花括号{}对数组或者结构体元素进行统一列表初始值设定 代码示例 (...std::initializer_list一般是作为构造函数参数,C++11STL中不少容器就增加 std::initializer_list作为参数构造函数,这样初始化容器对象就更方便了...新容器 array 在C++中,std::array 是一个固定大小容器,它提供了类似于数组接口,但它是标准库一部分,因此提供了更多安全性和灵活性。...你实际上是在告诉编译器:“这个对象之后可能不再需要了,或者可以接受它处于某种未定义状态,所以你可以安全地‘窃取’它资源。”

    8210

    C++11】入门基础

    C++11文档介绍,点击跳转 2. 统一列表初始化 2.1{}初始化   在C++98中,标准允许使用花括号{}对数组或者结构体元素进行统一列表初始值设定。...它是C++11引入,它主要目的是在不使用显式构造函数情况下,实现统一初始化语法。...std::initializer_list类型 std::initializer_list一般是作为构造函数参数,C++11STL中不少容器就增加std::initializer_list作为参数构造函数...std::initializer_list是一个标准库类型,在C++11中引入。它是一个模板类,用于在不使用显式构造函数情况下,以统一方式初始化容器或其他对象。 3....;原则上讲,exp只是一个普通表达式,它可以是任意复杂形式,但必须保证exp结果是有类型不能是void;如exp为一个返回值为void函数时,exp结果也是void类型,此时会导致编译错误

    5010

    C++11学习笔记1

    前言 很久以前就知道C++11我们课上讲C++有很多改进地方,当时也没有细学,最近一个偶然机会陡然发现原来身边同学好多都对C++11都颇有心得,推崇备至,回头想想在C++14,甚至C++17都不新鲜现在...于是呢就打算利用最近闲着时间,在补《人民名义》间隙顺便学学C++11应该也是极好。...用法 我们可以用auto声明其他变量,但是需要注意下面几点: auto 声明变量必须在编译阶段就能识别类型。 auto 不能声明非静态成员变量。 auto 不能用来声明函数参数。...在C++11里引入了基于范围for循环,它可以支持迭代任何容器、数组、初始化列表等类型。...::cout<< ite.first ; std::cout<< ite.second ; } 同时,这个迭代变量还可以声明成引用类型,也就是说我们可以通过他原数组进行修改: #include

    31510

    Google C++ 编程风格指南(五):其他 C++ 特性

    要高效率地使用某些标准库类型, 例如 std::unique_ptr, std::move 是必需. 缺点: 右值引用是一个相对比较新特性 (由 C++11 引入), 它尚未被广泛理解....一旦在类层级中加入新子类, 像这样代码往往会崩溃. 而且, 一旦某个子类属性改变了, 你很难找到并修改所有受影响代码块. 不要去手工实现一个类似 RTTI 方案....编译器可以更好地进行类型检测, 相应地, 也能生成更好代码. 人们编写正确代码更加自信, 因为他们知道所调用函数被限定了能或不能修改变量值....优点: 保持声明统一. 缺点: C++ 中整型大小因编译器和体系结构不同而不同....定义: C++11 中,若变量被声明成 auto, 那它类型就会被自动匹配成初始化表达式类型。您可以用 auto 来复制初始化或绑定引用。

    1.1K30

    【C++修炼之路】26.C++11(语法糖)

    C++11 C++11(语法糖) 本节目标 一.C++11简介 二.统一列表初始化 2.1 {}初始化 2.2 std::initializer_list 三.声明 3.1 auto 3.2 decltype...二.统一列表初始化 2.1 {}初始化 在C++98中,标准允许使用花括号{}对数组或者结构体元素进行统一列表初始值设定。...是作为常量区一个封装类型,通过查阅文档,其也有迭代器,可以将常量区元素一一遍历。...也可以作为operator=参数,这样就可以用大括号赋值。因此我们就知道了为什么vector类空间是如何初始化,vector构造函数就存在std::initializer_list参数。...那再来回顾一下当初模拟实现vector,由于我们并没有设置std::initializer_list构造,因此采用大括号进行初始化是错误,所以我们可以多重载一个std::initializer_list

    41300

    C++11基础学习系列一

    觉得原因有如下(不要劈,仅此个人意见): C++是C语言进行了抽象同时又支持了很多面向对象特性,在趋于底层设计时又对上层进行封装和扩展。...废话不说了,写一系列C++(c++11)文章,主要是记录自己学习、看书和遇到问题总结。好记性不如烂笔头。 类型 “千里之行始于足下”。...两者都间接提供了访问对象功能,其中C++11提供字面值nullptr来初始化指针。void * 可以存放任意对象地址....,所以不能被定义为constexpr,而算术类型、引用和指针都属于字面值类型所以可以定义为constexpr,但是constexpr指针必须是nullptr或者固定地址中对象,并且constexpr仅对指针有效...对于const引用,引用类型必须与其所引用对象类型保持一致,当然在初始化变量时可以使用常量表达式作为初始值: #include int main() { int a

    92240

    大一大二计算机专业同学应该学习什么?如何学习?

    当然,指针一直是很多初学者老大难,可以把指针作为一个专题彻底搞明白,关于这方面也有一本非常好书,这本书语言写也非常通俗易懂,当年读完之后,指针再无疑惑,书名叫《C和指针》。...,要熟悉新标准常用语法与新功能,包括:另外,时至今日,你一定要熟悉 C++11/14/17 常用语言特性和类库,这里简单地列一下: 左值/右值/std::move/std::forward 统一类成员初始化语法与...智能指针类 std::bind/std::function C++11/14 网上资料已经很多了,C++17 资料不多,重点掌握还是 C++11 引入各种实用特性,这就给读者推荐一些读过书...学习算法和数据一定不能急功近利,算法和数据结构知识一定要作为一个长期学习目标。...与 C 语言相关算法和数据结构书有: 《数据结构与算法分析—C语言描述》 当然,如果你觉得这块很难理解可以先通过一些轻松点书入门以建立一些感官认识,推荐《大话数据结构》这本书。

    83160

    写算法,用 C++ 还是用 Java ,差别大吗?

    大部分情况下,两种语言基本数据类型可以根据下表进行一转换,但是也有差异,需要特别注意。...字符串 很多 C++ 程序员喜欢用 char* 或 char 类型数组存储字符串,这其实是 C 语言用户带过来习惯,给出 C++ 算法实现字符串一般都用 std::string,对应 Java...C++11 版本引入了一种根据范围循环语法,一般理解和 Java 增强 for 循环类似,比如这种 C++ 循环形式: ? Java 与之对应形式是: ?...C++ 没有抽象基类语法,但是又抽象基类概念,一般当一个类中有一个纯虚函数时候,这个类是不能被直接实例化,它就类似于是一个抽象基类,比如: ?...C++ 函数有很多类型修饰,比如常见 const,C++11 后新增了 final 和 override,但是 = 0 一直是一个比较奇怪存在,它表明这个函数没有实现,需要在派生类中实现,同时,也说明这个类是不能被实例化

    2.8K20

    【Modern C++】深入理解左值、右值

    你好,是雨乐!...作为多年C++开发人员,一直以来,左值右值理解没有一个系统认识,总感觉似懂非懂。...自C++11开始,值类别又进行了详细分类,在原有左值基础上增加了纯右值和消亡值,并以上三种类型通过是否具名(identity)和可移动(moveable),又增加了glvalue和rvalue两种组合类型...rvalue不能放在赋值或者组合赋值符号左边,例如:3 = 5,3 += 5,这些表达式没有意义,也编译不过。 rvalue可以用来初始化const左值引用(见下文)。...深入 经过前面的内容,我们左值和右值(纯右值和将亡值)有了一个初步认识,在本节,我们借助一些例子,来加深左值和右值理解

    87721

    C++ 特性使用建议

    不要去手工实现一个类似RTTI方案,反对RTTI理由同样适用于这些方案,比如带类型标签类继承体系。而且,这些方案会掩盖你真实意图。...编译器可以更好地进行类型检测,相应地,也能生成更好代码。人们编写正确代码更加自信,因为他们知道所调用函数被限定了能或不能修改变量值。即使是在无锁多线程编程中,人们也知道什么样函数是安全。...C++11 中,若变量被声明成 auto,那它类型就会被自动匹配成初始化表达式类型。您可以用 auto 来复制初始化或绑定引用。...早在 C++03 里,聚合类型(aggregate types)就已经可以被列表初始化了,比如数组和不自带构造函数结构体: struct Point { int x; int y; }; Point...p = {1,2}; 从 C++11 开始,该特性得到进一步推广,任何对象类型可以被列表初始化

    1.7K20

    C++特性使用建议

    不要去手工实现一个类似RTTI方案,反对RTTI理由同样适用于这些方案,比如带类型标签类继承体系。而且,这些方案会掩盖你真实意图。...编译器可以更好地进行类型检测,相应地,也能生成更好代码。人们编写正确代码更加自信,因为他们知道所调用函数被限定了能或不能修改变量值。即使是在无锁多线程编程中,人们也知道什么样函数是安全。...C++11 中,若变量被声明成 auto,那它类型就会被自动匹配成初始化表达式类型。您可以用 auto 来复制初始化或绑定引用。...早在 C++03 里,聚合类型(aggregate types)就已经可以被列表初始化了,比如数组和不自带构造函数结构体: struct Point { int x; int y; }; Point...p = {1,2}; 从C++11开始,该特性得到进一步推广,任何对象类型可以被列表初始化

    1.9K30

    用 C++ 和 Java 写算法,有差别吗?

    大部分情况下,两种语言基本数据类型可以根据下表进行一转换,但是也有差异,需要特别注意。...3、字符串 很多 C++ 程序员喜欢用 char* 或 char 类型数组存储字符串,这其实是 C 语言用户带过来习惯,给出 C++ 算法实现字符串一般都用 std::string,对应 Java...C++11 版本引入了一种根据范围循环语法,一般理解和 Java 增强 for 循环类似,比如这种 C++ 循环形式: ? Java 与之对应形式是: ?...C++ 没有抽象基类语法,但是又抽象基类概念,一般当一个类中有一个纯虚函数时候,这个类是不能被直接实例化,它就类似于是一个抽象基类,比如: ?...C++ 函数有很多类型修饰,比如常见 const,C++11 后新增了 final 和 override,但是 = 0 一直是一个比较奇怪存在,它表明这个函数没有实现,需要在派生类中实现,同时,也说明这个类是不能被实例化

    2.4K10

    OpenCV4,5个方法让你从小白到大佬

    谢谢大家支持 目录 1、简介 之前在群里看到好多朋友halcon转opecv学习都很难。今天给大家讲讲。学习C++版本OpenCV会很难,是否需要基础知识。...但是后来OpenCV3之后,特别是OpenCV4以来早就支持标准C++11语法了,很多接口跟函数都特别容易理解C++11可以说应用最广泛C++标准之一了,语法通俗易懂,大量智能指针加持,支持各种标准容器操作...,可以说跟C#与Java这样面向对象语言语法基本完全类似可以让你轻松驾驭,只要你接触过面向对象编程语言,可以说零基础学习OpenCV C++完全不是问题,当然有几个最常用语法跟容器可能需要提前铺垫一下...2、使用auto关键字,避免过长类型变量声明 C++11支持auto关键字推导,这个可以避免很多不必要书写,提供代码编写效率。提升代码整洁跟优雅度,是个很好用关键字。...4、学会使用字符串流 std::stringstream是一个非常有用格式化输出,在OpenCV中如何什么想输出数据类型从int\float\double\string都可以往里面扔,拼接在一起,最后只要调用一下

    1.1K10

    【笔记】《深入理解C++11》(下)

    0 绪 本篇是看完《深入理解C++11C++11新特性解析与应用》后做笔记下半部分....define而提出编译期常量, 在表达式面前加上constexpr来声明 编译器会在编译时期constexpr进行值计算, 类似模板元编程 constexpr可以在函数前声明, 但是C++11时候常量表达式函数有很多限制...具体来说就是一个内存上变量"读取-变更-储存"过程作为整体一次性完成 std::atomic来声明一个原子变量 一般来说原子类型都属于资源型数据, 多个线程只能访问其拷贝, 删除了拷贝移动赋值等构造...这个变量在线程开始时候被初始化, 且可以取得地址, 但是取得是当前线程所指这个TLS变量地址 C++11TLS变量实现没有任何性能规定, 通常来说读写性能不会高于普通全局/静态变量 程序退出机制...很直观, 类型不完整类无法通过alignof编译 // 这里Color按照8字节对齐, 但是结构体显然大多数时侯是一整个一整个地访问 // 那么8字节对齐并不能提高读写效率, 也不能充分利用缓存

    1.1K30

    【Cocos2d-x游戏开发】细数Cocos2d-x开发中那些常用C++11知识

    下面我们就来一起学习一下Cocos2d-x开发中那些不得不了解C++11知识。  1.初始化列表 POD结构或者数组根据成员在结构内定义顺序,可以使用初始化列表来进行初始化以简化代码。...使用std::initializer_list可以让类和普通函数使用初始化列表,并且STL容器也是可以使用初始化列表,代码如下: //类使用初始化列表 class ClassA{ public:...//使用类型推导后   decltype也可以根据已有的对象自动识别类型,但是它和auto不同之处是:auto是自动推导出表达式右边类型,而decltype是自动推导出任意一个变量类型,并且可以用该类型来定义变量...,说起来比较难理解,看下面的代码就一目了然了: int num; decltype(num) b = 5;  3.自动范围推导 在C++11以前,写一个循环语句通常是这样:...(类似于Java中final用法)override和final并不是C++11关键字,只是在特定位置才有特殊含义,在其他地方仍然是当作变量来用

    47930
    领券