所谓现代 C++(即所谓的 Modern C++)指的是 C++11 及之后的版本,目前最新版本是 C++20,这期间一共有 C++11、C++14、C++17 三个版本。...各种技巧和避坑指南的书《Effective Modern C++》,这本书也不错,推荐一下: 五、常用编译器对 C++11/14/17 的支持情况 我目前公司的项目也全部使用 C++17 开发,对于...MSVC 编译器,支持 C++11 新标准的最低版本是VC++12(随Visual Studio 2013一起发布,Visual Studio 以下简称 VS),VS 2015 支持部分 C++14...特性,VS 2017 完美支持 C++14 和部分 C++17 特性,VS 2019 完美支持 C++17 大多数语言特性。...对于 gcc/g++ 编译器,支持 C++11 新标准的最低版本是 gcc/g++ 4.8,支持 C++14 是 gcc/g++ 4.9,gcc/g++ 7.3 完美支持 C++17 大多数语言特性。
、代码块等,书写位置可以位于目标之前,也可以位于目标之后。...对于作用于整个语句的通用属性,则应该写在语句起始处。如果出现在以上两种位置之外的通用属性,作用于哪个实体跟编译器具体实现有关。...3.C++14与C++17通用属性 在C++11的基础上,C++新标准C++14与C++17对通用属性进行了补充,主要有: (1)[[deprecated]]与[[deprecated(“reason”...示例: [[maybe_unused]] int a = something(); 使用以上通用属性,可以帮助我们更好的优化和管理代码。...---- 参考文献 [1]深入理解C++11[M].8.2通用属性 [2]《深入理解C++11》笔记-对齐支持和通用属性 [3]attribute specifier sequence(since
C++14(2014年) 2014年:C++14 发布,相较于 C++11,C++14 更像是一个小规模的优化和修复版本。...此外,还修复了一些编译器和实现中的问题。 C++14 让 C++11 中的很多新特性变得更加稳定,增加了可编程性和工具支持。 6....标准化过程:从 C++98 到 C++11,再到 C++14、C++17 和 C++20,C++ 逐渐成为一种具有广泛应用的编程语言,每个版本都带来了一些新的特性和增强,逐步适应现代软件开发的需求。...标准库改进: C++14 修复了 C++11 标准库中的一些问题,并改进了对各种常见编译器的支持。标准库中对线程、智能指针、算法等的支持变得更加稳定和高效。...C++17(也被称为C++ 2017)是C++编程语言的一个重要版本,它在C++11和C++14的基础上进行了许多改进,增强了语言特性、库功能以及编译器支持。C++17的主要亮点包括: 1.
C++11中,标准委员会赋予了auto全新的含义即:auto不再是一个存储类型指示符,而是作为一 个新的类型指示符来指示编译器,auto声明的变量必须由编译器在编译时期推导而得。...return 0; } 所以auto无疑是十分不错的选择 5、auto在C++14和C++17的更新 C++的auto关键字最初在C++11中引入,主要用于自动类型推导,使编程更简洁。...在后续的C++14和C++17标准中,对auto的使用进行了一些扩展和更新,进一步提高了其灵活性和功能性。...这意味着你可以在函数定义时使用auto关键字指定返回类型,编译器会根据返回语句推导出具体的类型。这样做可以增加代码的可读性和灵活性,特别是在模板编程和使用lambda表达式时。...示例: template auto add(T x, T y) { return x + y; } 泛型Lambda表达式: 虽然Lambda表达式在C++11中就已经支持,
一、前言 C++ 从诞生至今经历了多个标准版本的演进:从 C++98 到 C++03,再到飞跃式发展的 C++11、C++14、C++17,再到现代的 C++20 和即将发布的 C++23。...本文将以 C++11、C++14 和 C++17 为主线,全面讲解其核心语言特性,并配合代码示例分析其作用和最佳实践,适合有一定基础的 C++ 学习者深入理解现代 C++ 的精髓。...三、C++14:小而美的增强 C++14 主要是对 C++11 的补强,提升表达能力与开发体验。...四、C++17:向表达性迈进 C++17 是现代 C++ 向简洁、高性能进一步靠近的重要版本。...替代旧式枚举 防止作用域污染 使用标准库代替手动实现 STL 性能优良且安全 七、结语与延伸 C++11/14/17 是现代 C++ 的主力军,它们极大提升了代码表达力、可维护性和开发效率。
其中,K&R C 已经过时,不再使用,而 ANSI C、C99、C11 和 C18 都是现代 C 语言标准,但在实际开发中,使用最广泛的是 ANSI C 和 C99。...C++11:也称为 C++0x,是第二个 C++ 标准,由 ISO 制定,于 2011 年发布。 C++14:是 C++11 的后续版本,于 2014 年发布。...C++17:是 C++14 的后续版本,于 2017 年发布。 C++20:是 C++17 的后续版本,于 2020 年发布。 C++23:是 C++20 的后续版本,预计于 2023 年发布。...其中,C++98 是最初的 C++ 标准,但在实际开发中已经很少使用,而 C++11、C++14、C++17、C++20 和 C++23 都是现代 C++ 标准,不断引入新的特性和语法糖,使得 C++...在实际开发中,使用哪个标准需要根据实际情况进行考虑。
看到一个介绍 C++17 的系列博文(原文),有十来篇的样子,觉得挺好,看看有时间能不能都简单翻译一下,这是第一篇~ C++11, C++14, 以及 C++17.....如果你熟悉C++,那么你一定知道 C++98(第一个C++标准) 和 C++11 是两个非常大的C++标准, 但C++14,特别是C++03则是两个小标准....那么 C++17 是大标准还是小标准呢?从我的观点来看,答案其实挺简单的: C++17 介于 C++14 和 C++11 之间,既不属于大标准也不属于小标准,至于原因,看看下面的说明吧....语言核心层 fold expressions(折叠表达式) C++11 开始支持可变参数模板(即支持任意多数量参数的模板).其中任意数量的模板参数保存在参数包(parameter pack)中.在C++...+17 上述代码(第4行)与之前代码的一个细微差别是:在C++17中,编译器仍然可以执行一次 myVal 的复制操作(也可以不执行复制),但第7行代码仍然保证不会发生复制操作.
在C++的历次版本发布中,对C++模板参数的标准一直保持开放的态度,且对参数的要求也在逐渐放宽。从C++17开始,非类型的模板参数也可以在使用时定义了而不必定义在不同的作用域。...对于字符串变量,使用方式和之前的版本并没有太大的区别,都不能直接在模板类型参数中使用。...C++17除了继续遵守这个规范外,相对于之前的版本它允许在实例化模板的作用域内声明,然后使用。不得不说也算是一种进步了吧。...但是从C++17开始,可以在模板中使用一个返回指针的函数当做实参,如下面的代码在C++17版本编译器中可以通过: #include using namespace std; template...+14版本编译器中编译报错如下: 从报错信息可知,在C++17以前的版本中,使用指针作为模板的实参时需要对参数进行连接且不能将编译器内返回指针的函数在模板实例化时进行使用。
前言 本文代码测试环境为“GCC-9.1.0”,有关编译器的安装请参考《安装GCC-8.3.0及其依赖》,适用于“GCC-9.1.0”。...本文试图揭露Lambda背后一面,以方便更好的理解和掌握Lambda。...Lambda代码段实际为一个编译器生成的类的“operator ()”函数,编译器会为每一个Lambda函数生成一个匿名的类(在C++中,类和结构体实际一样,无本质区别,除了默认的访问控制)。...匿名类规则 编译器为Lambda生成的匿名类规则(不同标准有区别): 构造函数 拷贝构造函数 ClosureType() = delete; C++14前... = f1; return 0; } 上列代码在C++11、C++14和C++17均会报错。
从C++11起就引入了lambda表达式,C++14又对其进行了丰富,开始支持使用泛型lambda。到现在的C++17 lambda的功能又进行了扩展。...在C++17新特性中,主要支持了以下两种场景: 在常量表达式中使用 需要对当前对象的拷贝时使用,如不同的线程需要创建不同的对象。...,第一种写法是在编译器执行,第二种表示的是在编译器就会对变量进行赋值。...2 constexpr lambda的使用 下面的例子主要演示了在lambda中使用constexpr,代码分别在编译期和运行期调用lambda的场景,代码如下: auto hash = [](const...在C++11或者C++14中,如果要捕获this,可以通过值或者引用的方式进行。
1. auto关键字 从c++11开始,auto关键字能够通过初始化器推导出变量的类型。在c++14中,auto关键字的能力进一步提升,能够通过return语句推导出函数的返回类型。...但是,C++11中的auto推导,往往结果与预期的不同。 c++11 中为了支持统一初始化,引入了新的统一初始化语法,如下所示。...条件表达式中支持初始化语句 c++17中支持在 if 或者switch 语句中进行初始化, 这个能力的出现能够让代码更加的简洁。...4. std::string_view string_view我最早使用的是boost版本的,c++17中的string_view 和 boost类似。...C++17的新特性已经编译器的支持情况请参考 compiler_support#cpp17
最近很火的鸿蒙系统框架代码,很多就是基于c++做的底层、运行时和应用框架封装。c++11后续又有11,14,17,20等众多新版本。哪个是主流?截至目前来说,c++17应该是新项目的首选。...C++14在11的基础上查缺补漏,并未加入许多新特性,而C++17作为C++11后的第一个大版本,标志着现代C++逐渐走向成熟。...但是,C++11中的auto推导,往往结果与预期的不同。 c++11 中为了支持统一初始化,引入了新的统一初始化语法,如下所示。...+17支持在if的判断语句之前增加一个初始化语句,将仅用于if语句内部的变量声明在if内,有助于提升代码的可读性。...需要注意的是,c++17只提供了一个库级别的variant实现,没有对应的模式匹配(Pattern Matching)机制,而最接近的std::visit又缺少编译器的优化支持,所以在c++17中std
如果可能的话,我们应当尽量让我们的类满足半正则这个要求。 1.返回值优化(拷贝消除) 下面编译的gcc版本是支持c++17的gcc8.3。如果使用gcc5.5等版本结果会不同。...在 C++14 及之前确实是这样的。但从 C++17 开始,对于类似于 getA_unnamed这样的情况,即使对象不可拷贝、不可移动,这个对象仍然是可以被返回的!...C++17 要求对于这种情况,对象必须被直接构造在目标位置上,不经过任何拷贝或移动的步骤。...在 C++11 之前,返回一个本地对象意味着这个对象会被拷贝,除非编译器发现可以做返回值优化(named return value optimization,或 NRVO),能把对象直接构造到调用者的栈上...从 C++11 开始,返回值优化仍可以发生,但在没有返回值优化的情况下,编译器将试图把本地对象移动出去,而不是拷贝出去。
,如果在类中禁止编译器默认生成拷贝构造和移动构造函数,代码将不会被编译通过。...//代码在C++14版本中编译 class MyClass { public: MyClass(){cout的编译器在编译时已经对代码进行了优化,但是这种优化一般根据具体的编译器而定,C++17后这种优化变成了一种标准。 可以返回不允许拷贝或者移动的对象。...在泛型函数中使用了完美转发,具体可以参考下文: 【C++11】 改成程序性能的方法--完美转发 除此之外,在C++17之后类中禁止移动构造函数的默认生成在实际使用时可以正常编译和运行,但是在C++17之前是编译不过的...C++值类型体系可以分为三个阶段,分别是:C++11之前的值类型体系,C++11后到C++17期间的值类型体系以及C++17后的值类型体系。
C++版本 GCC版本支持情况 GCC版本 指定版本的命令标志 C++98 完全支持 GCC 6.1之前版本的默认模式 C++11 完全支持 GCC 4.8.1开始完全支持 -std=c++11 or...-std=gnu++11 C++14 完全支持 GCC 6.1版本开始完全支持,GCC 6.1到GCC 10的默认模式 -std=c++14 or -std=gnu++14 C++17 完全支持 GCC...5开始支持,GCC 7基本完全支持,GCC 8完全支持。...GCC 11的默认模式 -std=c++17 or -std=gnu++17 C++20 未完全支持 GCC 8开始陆续支持(因该标准较新,故GCC支持都是实验性质的) -std=c++20 or -std...=c++2ag++ or-std=gnu++20 C++23 未完全支持(标准还在发展中) GCC 11开始支持(因该标准仍不断发展,故GCC支持都是实验性质的) -std=c++2bg++ or -std
由于C++过于复杂,并且经历了长时间的发展演变,目前对于C++标准支持的较好主要有GNU C++和Visual C++,严格来说,目前还没有一个完全支持ISO C++的版本。...,让开发者更加便捷的使用C++在编译期的执行能力,即通过代码编译获得计算结果,学术性的称为模板元编程。...这些新的特性随着C++11标准的发布而被正式确立下来。近年来,C++标准的变更周期缩短,由C++11到C++14以及最近的C++17都只用了3年的时间。...C++14 是对 C++11的重要补充和优化,是C++发展历程中的一个小型版本,虽然新增的内容较少,但是仍然为用户“带来了极大的方便”,为实现使C++“对新手更为友好”这一目标作出努力。...到了2017年,C++迎来了C++17标准。此次对C++的改进和扩增,让C++变得更加容易接受和便于使用了。
像第五行这样,编译器是无法推断数据类型的。 最初,auto 的使用是非常受限的。在之后的版本中,auto 变得更加强大! ? 第 7 和第 8 行中,我使用了花括号初始化。...另一种非常普遍的应用是将其作为比较函数。 ? 上面的例子中有很多细节。 首先,要注意到列表初始化为你节省了多少代码。然后是通用的 begin() 和 end(),它们同样也是 C++11 中新添加的。...显然,现在你可以在 if/switch 语句块内初始化变量并且进行条件检查了。这对保持代码的紧凑和简洁是非常有帮助的。...因此如果某些操作可以让编译器来做,就可以减轻运行时的负担,从而提高时间效率。 ? 上面的代码是 constexpr 的一个常见例子。...从 c++17 开始,参数推断也适用于标准类模版。此前,该特性只支持函数模版。
不过,大家在学校里学习的书本一般比较老,主要还是C++98那些老一套。 本文所谓的C++新特性是指C++11及其以后的C++14、C++17增加的新关键字和新语法特性。...其中C++11是C++98以来最重要的一次变化,而其后的C++14、C++17是在该基础上的完善和补充。 那么,问题来了,如果我不想学习新特性,还是像以前那样编程可以吗?...C++11之前如果我们要定义并初始化一个新变量,必须得知道其类型并定义,这在很多时候是非常繁琐的,比如迭代器的使用,而C++11之后引入了自动类型推导,一个auto解决一切,不需要关心类型,编译器会帮你自动推导出类型...2、省心省力的自动类型推导 C++11中引入了auto,可以用来进行自动类型推导,不用关心数据类型,编译器会帮你推导好,而且这种方式也不影响编译速度。...而且这种循环支持大部分数据类型,比如数组,容器,字符串,迭代器等等。 ?
同时该结构体结合了C风格数组的性能、可访问性和容器的优点(可获取大小、支持赋值和随机访问等)。...() const noexcept; //C++11 起, C++17 前 constexpr const T* data() const noexcept; //C++17 起 其返回的指针使得范围...2.2.3 迭代器 begin、end和cbegin、cend begin和cbegin返回指向deque首元素的迭代器,end和cend返回指向deque末元素后一元素的迭代器。...不支持复制或移动多维内建数组。...在使用array容器的时候,其size必须是常量表达式(即编译时已知)。 不支持大小更改操作(调整大小、插入、擦除等)。
GCC支持在编译的时候使用-std选项来选择编译语言的标准。程序本身也是在发展的,不断变化的。...以 C 语言为例,发展至今该编程语言已经迭代了诸多个版本,例如 C89(偶尔又称为 C90)、C94(C89 的修订版)、C99、C11。...同样,C++语言也经历了很多的标准变化,例如C++11,C++14,以及现在最新的C++20。既然语言都发展了这么多的标准,GCC编译器当然也要提供一个标准开关,他就是-std选项。...对于编译 C、C++ 程序来说,借助 -std 选项即可手动控制 GCC 编译程序时所使用的编译标准。 这个选项的使用的方式也很简单。下面就是一个例子。...g++ -Wall -std=c++17 test.c 有关这些标准可以参考如下。 ?