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

为什么在没有显式C++11支持的情况下,GCC 6.3要编译这个带括号的初始化列表代码?

在没有显式C++11支持的情况下,GCC 6.3编译带括号的初始化列表代码的原因是为了提供向后兼容性和支持旧版本的代码。

在C++11之前的标准中,初始化列表的语法是不支持使用花括号进行初始化的。然而,C++11引入了新的语法规则,允许使用花括号进行初始化列表。这种语法的引入是为了提供更加简洁和直观的初始化方式,并且可以避免一些潜在的类型转换问题。

尽管GCC 6.3没有显式地支持C++11标准,但它可能会尝试编译带括号的初始化列表代码。这是因为GCC 6.3可能会尝试根据代码的上下文进行推断,以确定初始化列表的正确含义和用法。这种行为是为了向后兼容旧版本的代码,并且可以使得一些使用了新语法的代码在旧版本的编译器上也能够编译通过。

然而,由于GCC 6.3没有显式地支持C++11标准,这种行为可能会导致一些潜在的问题。例如,如果代码中使用了C++11标准中新增的特性或语法,而GCC 6.3无法正确解析和处理,那么编译过程可能会出现错误或警告。

总之,GCC 6.3在没有显式C++11支持的情况下编译带括号的初始化列表代码是为了提供向后兼容性和支持旧版本的代码。然而,建议在使用新的语法特性时,使用支持C++11标准的编译器,以确保代码的正确性和可移植性。

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

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

C++11-列表初始化变量类型推导范围forfinal&override默认成员函数控制

相比较而言,C++11能更好地用于系统开发和库开发、语法更加泛华和简单化、更加稳定和安全,不仅功能更强大,而且能提升程序员开发效率 二、列表初始化 背景引入: C++98中,标准允许使用花括号...1、内置类型列表初始化 C++11扩大了用大括号括起列表(初始化列表)使用范围,使其可用于所有的内置类型和用户自定义类型,使用初始化列表时,可添加等号(=),也可不添加 示例: int...C++中对于空类编译器会生成一些默认成员函数,如果在类中定义了,编译器将不会重新生成默认版本 有时候这样规则可能被忘记,最常见是声明了参数构造函数,必要时则需要定义不带参数版本以实例化无参对象...而且有时编译器会生成,有时又不生成,容易造成混乱,于是C++11让程序员可以控制是否需要编译器生成 缺省函数 C++11中,可以默认函数定义或者声明时加上=default,从而显指示编译器生成该函数默认版本...,用=default修饰函数称为缺省函数 示例: class A { public: A(int a) : _a(a) {} // 缺省构造函数,由编译器生成 A() = default

70160

Modern C++,学炸了!!

),改进或者增强了C++ 98/03标准中一些语法元素用法(如auto 关键字、统一类初始化列表语法),新增了一些其他编程语言早已经支持关键字和语法(如final关键字、=default语法 、=...: //右边**expression**可以是一个函数调用、花括号表达式或者支持结构化绑定某个类型变量。...虽然类型可以不一样,但这两种类型之间仍然支持 operator != 操作。C++17 就 C++14 这种改变,对旧代码不会产生任何影响,但可以让后来开发更加灵活。...对于 gcc/g++ 编译器,支持 C++11 新标准最低版本是 gcc/g++ 4.8,支持 C++14 是 gcc/g++ 4.9,gcc/g++ 7.3 完美支持 C++17 大多数语言特性。...各个编译器对于 C++11/14/17 语法特性和标准库支持情况,完整列表可参考:https://en.cppreference.com/w/cpp/compiler_support。

3K10

类和对象:C++11新特性与知识补充

C++11) 缺省值作用 初始化列表就是成员变量定义地方,每个成员都要走初始化列表 没有初始化列表进行定义成员: 声明时有缺省值:会在经历初始化列表时候用缺省值进行定义...声明时没有缺省值: 内置类型:看编译器,大概率随机值 自定义类型:调用默认构造,无默认构造时候会报错 private: // 注意这⾥不是初始化,这⾥给是缺省值,这个缺省值是给初始化列表...; 因为每个成员都需要通过初始化列表进行初始化,如果在初始化列表没有初始化的话,成员就会通过声明处缺省值进行初始化 所以说明缺省值是与初始化列表相对应,与参数传递无关 **缺省值确实是与初始化列表相对应...,并且只有初始化列表没有初始化成员变量时,缺省值才会被使用。...+11 花括号初始化 aa3.Print(); return 0; } 临时变量 当我们进行类型转换时,特别是类型转换情况下编译器有时会创建一个临时对象作为中间变量

7810

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

regex, 库尽量以头文件实现, 但也有并行库这种必须深入编译库 用通用而非特殊手段来实现特性: 类型转换 让特性对专家和新手都适用: 统一初始化表达式 增强类型安全: enum class...不但可以调用基类构造函数, 也可以调用当前类其他构造函数, 这样就能进一步减少重复代码 但要注意委派构造不能和普通初始化列表共用, 因为目标构造(初始化列表)总是先于委派构造被调用, 这会导致目标构造参数无效...C++11标准中提出SFINEA动机是当年C++98中并没有这个规则进行标准化描述, 因此各个编译器对于函数模板匹配规则都是混乱, 因此新标准提出SFINEA来使程序员能按照自己想象来理解编译器并令其能精确匹配我们所需要函数..., 所以不会降低效率 标准库中std::result_of()内部type命名本质就是decltype decltype有所谓推导四原则: 如果目标是一个没有括号标记符表达式(也就是除去关键字...如果目标是被重载函数则编译错误 否则, 对于括号表达式, 如果目标是将亡值, 那么返回右值引用 对于括号表达式, 如果目标是左值, 返回左值引用 否则返回目标本身类型 推导四规则中最麻烦是规则

1.8K20

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

优点: 有了流, 在打印时不需要关心对象类型. 不用担心格式化字符串与参数列表不匹配 (虽然 gcc 中使用 printf 也不存在这个问题). 流构造和析构函数会自动打开和关闭对应文件....如果 32 位和 64 位代码共用持久化结构体, 需要确保两种体系结构下结构体对齐一致. 大多数编译器都允许调整结构体对齐. gcc 中可使用 __attribute__((packed))....程序员必须会区分 auto 和 const auto& 不同之处,否则会复制错东西。 auto 和 C++11 列表初始化合体令人摸不着头脑: auto x(3); // 圆括号。...复杂地方使用模板代码让人更不容易读懂, 并且debug 和 维护起来都很麻烦 模板编程经常会导致编译出错信息非常不友好: 代码出错时候, 即使这个接口非常简单, 模板内部复杂实现细节也会在出错信息显示...优点: 二〇一四年八月之前,C++11 一度是官方标准,被大多 C++ 编译支持。它标准化很多我们早先就在用 C++ 扩展,简化了不少操作,大大改善了性能和安全。

1.1K30

C++中五花八门初始化规则

编译器会把等号右侧初始值拷贝到新创建对象中去,不使用等号则执行是直接初始化 传统C++中列表初始化仅能用于普通数组和POD类型,C++11新标准将列表初始化应用于所有对象初始化(但是内置类型习惯于用等号初始化...,类初始化取决于构造函数中对数据成员初始化,如果没有构造函数初始值列表初始化数据成员,那么成员将在构造函数体之前执行默认初始化,例如: // 通过构造函数初始值列表初始化数据成员: 数据成员通过提供初始值进行初始化...C++98/03与C++11列表初始化 C++98/03中,普通数组和POD(Plain Old Data,即没有构造、析构和虚函数类或结构体)类型可以使用花括号{}进行初始化,即列表初始化。...初始化习惯 尽管C++11列表初始化应用于所有对象初始化,但是内置类型习惯于用等号初始化,类类型习惯用构造函数圆括号初始化,vector、map和set等容器类习惯用列表初始化。...Tips: 类对象在被列表初始化时会优先调用列表初始化构造函数,如果没有列表初始化构造函数则会根据提供括号值调用匹配构造函数 C++11新标准提供了两种方法用于处理可变数量形参, 第一种是我们这里提到

2.5K10

C++入门必备知识(你真的入门C++了吗?)

C语言不支持(编译器不支持) 函数重载 1、函数重载概念 函数重载:是函数一种特殊情况,C++ 允许同一作用域中声明几个功能类似的同名函数,这些同名函数形参列表(参数个数或类型或顺序)必须不同,...这里每个编泽器都有自己函数名修饰规则。 4.由于Windows下vs修饰规则过于复杂,而Linux 下gcc修饰规则简单易懂,下面我们使用 了gcc演示了这个修饰后名字。...= 12.34; //int& rd = d; // 该语句编译时会出错,类型不同 const int& rd = d; } 这里涉及到一个知识点: 类型转换时候,不是直接将被转化变量改变类型...8.访问实体方式不同,指针需要解引用,引用编译器自己处理 9.引用比指针使用起来相对更安全 内联函数 1、概念 以inline修饰函数叫做内联函数, 编译时C++编译器会在调用内联函数地方展开...auto关键字(C++11) 1、auto简介 早期C/C++中auto含义是:使用auto修饰变量,是具有自动存储器局部变量,但遗憾是一直没有人去使用它,大家可思考下为什么?

46820

C++11知识点总结(全面解析C++11经常考到知识点)

列表初始化 2.1 C++98中{}初始化问题 C++98中,标准允许使用花括号{}对数组元素进行统一列表初始值设定。...C++11扩大了用大括号括起列表(初始化列表)使用范围,使其可用于所有的内置类型和用户自定义类型,使用初始化列表时,可添加等号(=),也可不添加。...如果在类中定义了,编译器将不会重新生成默认版本。有时候这样规则可能被忘记,最常见是声明了参数构造函数,必要时则需要定义不带参数版本以实例化无参对象。...8.1 缺省函数 C++11中,可以默认函数定义或者声明时加上=default,从而显指示编译器生成该函数默认版本,用=default修饰函数称为缺省函数。...C++11中,编译器会为类默认生成一个移动构造,该移动构造为浅拷贝,因此当类中涉及到资源管理时,用户必须定义自己移动构造。

2K10

C++11『基础新特性』

即可 以下是不同编译器对 C++11 语法支持情况(绿色表示最低支持版本,红色表示不支持) 主流编译器有:GCC、Clang、MSVC,其中 GCC 就是 Linux 中使用编译器,基本上...GCC 4.6 及后续版本就能对 C++11 进行很好支持,而 MSVC 是微软 VS 系列编译器,从 VS 2015 及后续版本对 C++11 语法支持较好 推荐使用 VS 2019 或 VS...int m, int y) :_day(d), _month(m), _year(y) {} 接下来同样代码,尝试编译,结果出现了错误 现在情况是 d1 列表初始化失败,d2 列表初始化成功 这是因为...可能有的人会说我们都是直接使用 { } 初始化,没错,你使用正是 列表初始化 这个新特性,只是你没有发现罢了 int main() { // C++11 之后 vector arr =...那就不支持,比如拿出我们之前模拟实现 vector (代码太长了,这里就不放完整代码了,重点在于看现象) 直接就报了一个错误,前面说过,支持 列表初始化 也很简单,重载一个参数为 initializer_list

22740

C++奇迹之旅:构造函数和析构函数

默认成员函数:用户没有实现,编译器会生成成员函数称为默认成员函数。...//参是直接在后面加括号 d2.print(); return 0; } 调用参构造函数,参是直接在后面加括号。...两者结合,构成重载关系: 如果类中没有定义构造函数,则C++编译器会自动生成一个无参默认构造函数,一旦用户定义编译器将不再生成。...//参是直接在后面加括号 d2.print(); return 0; } 一旦自己定义任何构造函数,编译器将不再生成。...但是:main函数中不能直接调用Time类析构函数,实际释放是Date类对象,所以编译器会调用Date类析构函数,而Date没有提供,则编译器会给Date类生成一个默认析构函数,目的是在其内部调用

8710

【C++修行之道】类和对象(二)类6个默认成员函数、构造函数、析构函数

空类中真的什么都没有吗?并不是,任何类什么都不写时,编译器会自动生成以下6个默认成员函数。 默认成员函数:用户没有实现,编译器会自动生成(半自动化)成员函数称为默认成员函数。...2.2.5 自动生成默认构造函数 如果类中没有定义构造函数,则C++编译器会自动生成一个无参默认构造函数,一旦用户定义编译器将不再生成。...“Date”: 没有合适默认构造函数可用 Date d1; return 0; } 在这个Date类定义中,并没有定义任何构造函数。...简化代码:由于 MyQueue 类在这个例子中没有特殊初始化需求,因此不需要手动编写构造函数。 如果类中没有需要特别处理初始化逻辑,那么自动生成构造函数可以简化代码,避免不必要冗余。...但是:main函数中不能直接调用Time类析构函数,实际释放是Date类对象,所以编译器会调用Date类析构函数,而Date没有提供,则编译器会给Date类生成一个默认析构函数。

8910

Modern c++快速浅析

因为这是一个拷贝指针操作,因此保留原指针不可更改指向性并没有太大意义 auto 大多数情况下auto推断出来结果和模板类型推导结果是一样,不同点在于对大括号初始物处理 值与指针等推导 const...,返回值类型推导遵循是模板类型推导原则,因此对于大括号初始物而言,没有办法正确推导 // 无法通过编译 auto func() { return {1, 2, 3}; } 但我们更应该知道,...int arr[pFunc(100)]; 捕获生命周期 C++中其实并没有闭包概念,更准确应该将lambda划分为捕获lambda以及不带捕获lambda C#这种具备GC机制语言中,闭包能够延长捕获变量生命周期...:C++中不允许void*指针隐转换为其他指针类型,即下面代码是非法 int* p = (void*)0; nullptr是C++11一个关键字,它类型是std::nullptr_t #ifdef...template void processPointer(char*) = delete; = default只能用在特定成员函数中,要求编译器生成对应版本函数 override

16210

C++11新特性学习笔记

C++11中,强类型枚举解决了这些问题: 3.6 常量表达式(vs2013 不支持) 常量表达式主要是允许一些计算发生在编译时,即发生在代码编译而不是运行时候。...这些类特殊成员函数负责创建、初始化、销毁,或者拷贝类对象。如果程序员没有地为一个类定义某个特殊成员函数,而又需要用到该特殊成员函数时,则编译器会隐这个类生成一个默认特殊成员函数。...但是,如果程序员为类自定义了非默认构造函数,编译器将不再会为它隐地生成默认无参构造函数。...C++11标准中,要求编译器对模板右尖括号做单独处理,使编译器能够正确判断出”>>”是一个右移操作符还是模板参数表结束标记。...,却不支持函数模板默认模板参数: //1、普通函数默认参数,c++98 编译通过,c++11 编译通过 void DefParm(int m = 3) {} //2、类模板是支持默认模板参数,c+

2.2K20

C++11新特性学习笔记

C++11中,强类型枚举解决了这些问题: 3.6 常量表达式(vs2013 不支持) 常量表达式主要是允许一些计算发生在编译时,即发生在代码编译而不是运行时候。...这些类特殊成员函数负责创建、初始化、销毁,或者拷贝类对象。如果程序员没有地为一个类定义某个特殊成员函数,而又需要用到该特殊成员函数时,则编译器会隐这个类生成一个默认特殊成员函数。...但是,如果程序员为类自定义了非默认构造函数,编译器将不再会为它隐地生成默认无参构造函数。...C++11标准中,要求编译器对模板右尖括号做单独处理,使编译器能够正确判断出”>>”是一个右移操作符还是模板参数表结束标记。...,却不支持函数模板默认模板参数: //1、普通函数默认参数,c++98 编译通过,c++11 编译通过 void DefParm(int m = 3) {} //2、类模板是支持默认模板参数,c+

2K20

哪个版本gcc支持c11

像C++这样编程语言,通过一种演化过程来发展其定义。这个过程不可避免地将引发与现有代码兼容问题,C++发展过程中偶尔会发生。...关于C++11新特性和一些版本变更请看:C++11-维基百科     目前最新版本GCC/G++是4.8,新版本GCC支持最新C++11标准,十分值得去使用&学习。...下面让我们Ubuntu12.04 LTS用上GCC最新版本,去体验C++11新标准带来东西吧!...既然GCC-4.8使用了最新C++11标准,但是我们为什么还是提示错误呢?解决方法如下: 在编译时候添加-std=c++11选项即可正常编译C++11标准代码!...提示错误:‘c’变量没有类型,范围for循环不允许C++98标准中使用 这是因为GCC/G++默认-std(即C++语言标准)不是C++11,在这里默认是C++98,所以需要地开启,即添加-

7.5K20

【c++】类和对象(六)深入了解隐类型转换

,接着是一个以逗号分隔数据成员列表,每个成员变量后面跟一个放在括号初始值或表达式 那么,为什么要使用初始化列表呢?...而_year、_month、和_day虽然没有初始化列表中被赋值,但它们会在构造函数体开始执行前完成默认初始化(对于基本数据类型,这意味着它们初始值是未定义)。...实际执行时,未定义值可能是内存中该位置任何值,这取决于编译器和运行时环境。 修正这个问题,应该按照成员变量类中声明顺序初始化它们,或者更改成员变量声明顺序以反映期望初始化顺序。...优化:很多情况下编译器可以应用(拷贝消除)优化来避免真正创建临时对象和执行拷贝(或移动)操作,直接在obj存储位置构造对象 为什么可以直接赋值?...,禁止类型转换 单参构造函数,没有使用explicit修饰,具有类型转换作用 C++11及以后版本版本支持多个参数隐类型转换 class A { public: //explicit A(int

23210

C++11 decltype 用法

,但是不想用该表达式初始化变量(如果初始化就用auto了)。...同时C++11中typeid还提供了hash_code这个成员函数,用于返回类型唯一哈希值。...RTTI会导致运行时效率降低,且泛型编程中,我们更需要编译时就要确定类型,RTTI并无法满足这样要求。...编译时类型推导出现正是为了泛型编程,非泛型编程中,我们类型都是确定,根本不需要再进行推导。 而编译时类型推导,除了我们说过auto关键字,还有本文decltype。...推导规则 参考博客:C++11新标准:decltype关键字 如果e是一个没有括号标记符表达式或者类成员访问表达式,那么decltype(e)就是e所命名实体类型。

23540

c++基础之变量和基本类型

而c++有的地方就只是一个语法糖,或者说并没有转化到汇编中,而是直接在编译阶段做一个语法检查就完了。并没有生成汇编代码。也就是说之前写c/c++不能涵盖它们全部内容。...这里提一句,mac shell中,g++和gcc默认使用是4.8版本,许多新c++标准并不被支持,需要下载最新编译器并使用替换环境中使用默认编译器,使其更新到最新版本 gcc / g++...c++11之后支持初始化列表进行初始化使用初始化列表进行初始化时如果出现初始值存在精度丢失情况时会报错 c++11之后列表初始化语句,支持使用赋值运算幅、赋值运算符加上{}、或者直接使用{}、直接使用...,c++支持分离编译机制,该机制允许将程序分割为若干个文件,每个文件可被独立编译。...如果extern 关键字后面跟上了初始化语句,则认为该条语句是变量定义语句。变量可以声明多次但是只能定义一次。

1.5K30

C++中列表初始化,你知多少?

列表初始化 C++11 标准中被引入,是现代 C++ 编程风格一部分。...需要进行类型转换时,最好使用安全转换方式,例如使用 static_cast 并在可能丢失信息地方进行检查和处理。... C++11 引入列表初始化中,提供了对缩窄转换更严格检查,不允许列表初始化时发生缩窄转换,从而帮助程序员避免潜在问题。...空列表初始化 某些情况下,可以使用空括号 {} 进行初始化,这会被解释为对应类型默认值。...,但有一些情况下不适合或者不能使用列表初始化: 不支持聚合初始化列表初始化主要用于聚合类型初始化,而对于不支持聚合初始化类,不能使用列表初始化

6410
领券