首页
学习
活动
专区
工具
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

列表初始化:轻量级对象initializer_list

该章节将结合具体代码,深入讲解C++11列表初始化,与C++98进行对比,更清晰地理解这些概念。...C++98中初始化方式 在C++98中,数组和聚合类型(如结构体)可以使用大括号{}进行初始化,但基本类型和自定义类对象通常不能直接使用{}初始化,需要使用构造函数或赋值操作。...return 0; } C++11列表初始化 C++11引入了列表初始化,使得几乎所有类型对象都可以使用{}进行初始化,包括基本类型和自定义类对象。...,C++11引入了std::initializer_list,提供了一种统一方式来初始化容器和自定义类型。..._length:表示元素数量。 特性 只读容器:std::initializer_list是一个轻量级只读容器,不能修改其中元素。 自动推导类型可以通过auto关键字自动推导类型

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

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

    81140

    【笔记】《深入理解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新特性 --- 列表初始化,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完全可以替代!

    9810

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

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

    9510

    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类型,此时会导致编译错误

    5210

    【C++高阶】:C++11深度解析上

    统一列表初始化 1.1 { }初始化 在C++98中,标准允许使用花括号{}对数组或者结构体元素进行统一列表初始值设定。...C++11中废弃auto原来用法,将其用于实现自动类型腿断。这样要求必须进行显示初始化,让编译器将定义对象类型设置为初始化类型。...右值引用是C++11引入一种新类型引用,它通过类型后加&&来表示。右值引用可以绑定到右值上,但也可以绑定到左值上(需要std::move来显式转换)。...给右值取别名后,会导致右值被存储到特定位置,且可以取到该位置地址(可以理解右值取别名之后,这个别名就变为了左值),也就是说例如:不能取字面量10地址,但是rr1引用后,可以对rr1取地址,也可以修改...,那为什么C++11还要提出右值引 用呢?

    6710

    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

    32310

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

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

    1.1K30

    【C++】语法简化和增强,C++11都做了什么?

    1、统一列表初始化 C++11支持一切皆可列表初始化。...在C++98中我们可以对数组和结构体用{}进行初始化C++11扩大了{}使用范围,使其可以对所有内置类型和自定义类型初始化,可是说是统一了列表初始化方式。其中初始化列表时,=是可以省略。...容器{}初始化可以有任意多个参数 1.2 std::initializer_list std::initializer_list是C++11引入一种特殊类型,它提供了一种简洁、直观方式来初始化容器或数组...则是一个模板类,用于接收这些值 联系: 当使用列表初始化语法时,编译器会生成一个std::initializer_list对象来存储初始化列表中元素 类构造函数可以重载以接受一个std::initializer_list...是一个特殊关键字,nullptr是一种特殊类型字面量,它可以转换成任意其他类型指针类型,使用nullptr定义空指针可以避免类型转换问题,因为nullptr只能被隐式地转换为指针类型,而不能被转换为整数类型

    7410

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

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

    84360

    C++11基础学习系列一

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

    92640

    写算法,用 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

    【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

    41700

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

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

    90421

    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
    领券