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

72360

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。

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

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

    8910

    C++11】入门基础

    C++11文档介绍,点击跳转 2. 统一列表初始化 2.1{}初始化   C++98中,标准允许使用花括号{}对数组或者结构体元素进行统一列表初始值设定。...+11扩大了用大括号括起列表(初始化列表)使用范围,使其可用于所有的内置类型和用户自定义类型,使用初始化列表时,可添加等号(=),也可不添加: struct Point { int _x; int...它是C++11引入,它主要目的是不使用构造函数情况下,实现统一初始化语法。...初始化列表是一种在对象创建过程中用于初始化成员变量或数组语法。它使用花括号{}将初始值列表放在对象构造函数或初始化器中。...std::initializer_list是一个标准库类型,C++11中引入。它是一个模板类,用于不使用构造函数情况下,以统一方式初始化容器或其他对象。 3.

    5210

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

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

    1.9K20

    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.7K10

    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修饰变量,是具有自动存储器局部变量,但遗憾是一直没有人去使用它,大家可思考下为什么?

    48720

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

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

    2.1K10

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

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

    9910

    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

    27840

    【C++篇】C++类与对象深度解析(四):初始化列表、类型转换与static成员详解

    1.2 初始化列表语法 语法结构:初始化列表使用方式是构造函数名后跟一个冒号,接着是一个以逗号分隔成员变量列表,每个成员变量后面紧跟括号初始值或表达式。...1.7 初始化列表总结 每个构造函数都有初始化列表,即使你没有地写出它。 每个成员变量都必须被初始化,即使它没有初始化列表地被初始化。...对于引用类型、常量和没有默认构造函数类类型成员,必须在初始化列表中进行初始化C++11 允许成员变量声明时提供默认值,这些默认值会在初始化列表中未初始化时使用。...2.1.1 隐类型转换 没有explicit关键字修饰构造函数情况下编译器会自动将符合构造函数参数类型内置类型值隐转换为类对象。...2.4 C++11多参数类型转换 C++11之前,类型转换通常只能支持单参数构造函数。

    28810

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

    随着各大主流编译器(如GCC、Clang、MSVC等)对C++11语法支持逐渐完善,越来越多项目开始采用C++11标准进行开发。...统一列表初始化 C++11及以后版本中,引入了统一列表初始化(Uniform Initialization)或称为初始化列表(Initialization List),这是一种新初始化语法,...统一列表初始化不仅提高了代码一致性和可读性,还解决了之前初始化语法中一些歧义和限制 { }初始化 C++98中,标准允许使用花括号{}对数组或者结构体元素进行统一列表初始值设定 代码示例 (...initializer_list 是 C++11 引入一个特性,它提供了一种方式来初始化容器类对象或函数参数列表,使得可以使用花括号 { } 来直接初始化对象或传递参数。...右值引用可以绑定到右值上,但也可以绑定到左值上(需要std::move来转换)。

    9510

    C++11入门基础篇

    所以最终定名为C++11 统一列表初始化 { }初始化 C++98中,标准允许使用大括号{}对数组或者结构体元素进行统一列表初始值设定。...; } C++11扩大了用大括号括起来列表{初始化列表}使用范围,使其可用于所有的内置类型和用户自定义类型,使用初始化列表时,可添加等号,也可不添加。...而这些容器之所以支持使用列表进行初始化,根本原因是因为C++11给这些容器都增加了一个构造函数,这个构造函数就是以initializer_list作为参数。...因为这个迭代器类型定义一个类模板中,该类模板未被实例化之前编译器是无法识别这个类型。...二、迭代对象支持++和==操作   范围for本质上是由迭代器支持代码编译时候,编译器会自动将范围for替换为迭代器形式。

    9210

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

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

    15410

    初识C++ · C++11(1)

    1 统一列表初始化 初始化列表我们前面vector时候就有所涉及了,但是当时我们介绍不是那么深入,介绍了数组赋值那个花括号里面的叫做initializer_list,C++11版本支持这种自定义赋值...C++11中委员会扩大了列表初始化范围,从标准库里面的vector等stl容器到用户自定义类型或者是内置类型都可以这么初始化了,所以一个整型,一个数组可以初始化方式就有很多种了: int main(...,可以圆括号构造初始化,也可以花括号列表初始化,花括号赋值符号可以删除,这个设计看起来可能有点冗余了,但是呢,毕竟发明出来了,咱们想用就用,毕竟影响不大。...所以列表初始化出来了一个结论:万物皆可列表初始化 但是呢,列表初始化实际上走也是隐类型转换,比如单参数自定义类型,构造函数加上explicit,构造函数变成了,禁止了隐类型转换,如下...提到了列表初始化,就不得不提到initializer_list了,这里以vector为例子: C++11版本,支持initializer_list构造,这样对于对象创建就更加简单了。

    6910

    三、从C语言到C++(三)

    例如:int a(0); 或 string str1("hello"); 值初始化: 值初始化是指使用了初始化器(即使用了圆括号或花括号)但却没有提供初始值情况。...使用列表初始化和统一初始化语法可以提高代码可读性和安全性,特别是处理复杂数据类型时。 对于类类型,尽量使用构造函数初始化列表初始化成员变量,而不是构造函数函数体内进行赋值。...这可以提高效率,并确保成员变量构造函数体执行任何代码之前就已经被正确初始化。 if / switch 语句初始化 C语言中,if 和 switch 语句本身并不直接支持初始化变量功能。...这些信息对于delete[]来说是必要,因为它需要知道调用多少个析构函数以及释放多少内存。如果你只使用delete,编译器将不知道这些信息,从而导致不正确内存管理。...当你完成对象使用后,必须调用对象析构函数(在这个例子中是ptr->~T()),因为定位放置new不会自动调用析构函数或释放内存。

    9010

    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

    19510

    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+

    2.1K20
    领券