网站首页 > 基础教程 正文
关于 c++ 标准 11 、14 、 17 、20
关于c++标准, 直接问 文心一言
1、c++ 11
C++11标准中增加了一些新的关键字,这些关键字主要用于支持新引入的语言特性。以下是一些C++11中新增的关键字:
- auto:用于自动类型推导,编译器可以根据初始化表达式自动推断出变量的类型。
- nullptr:表示空指针常量,与C语言中的NULL有所不同,nullptr是类型为nullptr_t的常量。
- static_assert:用于在编译时执行断言,可以用来检查类型或值的约束条件。
- extern "C":用于指定代码的链接语言为C,以便在C++代码中调用C语言库函数。
- alignas:用于指定变量或类型的对齐方式。
- noexcept:用于表示函数不会抛出异常。
- override:用于表示虚函数在基类中的实现被重写。
- final:用于表示类或成员函数不能被继承或重写。
- nullptr_t:表示空指针类型的别名。
- auto_ptr:已经被弃用,不再建议使用。
除了新增的关键字之外,C++11还引入了一些新的特性,如智能指针、范围for循环、lambda表达式等,这些特性可以与原有的关键字一起使用,提高代码的可读性和可维护性。
2、C++ 14
C++14中没有新增的关键字,只增加了一些特性。
C++14是C++语言的一个版本,它在C++11的基础上进行了一些改进和扩展,但并没有新增关键字。C++14主要增加了以下特性:
- 扩展的模板元编程(Extended Template Metaprogramming):C++14引入了新的模板元编程语法,包括嵌套模板、模板别名和模板参数包等,使得模板元编程更加灵活和强大。
- 初始化列表(Initializer Lists):C++14引入了初始化列表语法,允许使用花括号 {} 初始化对象,这对于构造函数的参数传递、变量初始化等场景非常有用。
- 尾递归优化(Tail Call Optimization):C++14引入了尾递归优化,允许编译器在某些情况下将递归调用转换为循环调用,从而提高递归调用的效率。
- 范围for循环(Range-based for loop):C++14引入了范围for循环语法,允许使用基于范围的for循环来遍历数组、容器等数据结构。
- 函数默认参数(Default Function Arguments):C++14允许在函数声明时指定默认参数值,使得函数调用更加灵活和方便。
- 属性(Attributes):C++14引入了属性语法,允许在函数、变量等声明时添加一些元数据信息,用于指示编译器进行特定的优化、警告等操作。
- 类型特性(Type Traits):C++14扩展了类型特性库,增加了更多的类型特征模板和算法,用于操作和查询类型特性。
- 右值引用(Rvalue References):C++14对右值引用进行了改进,允许将右值引用作为模板参数传递给函数,提高了代码的灵活性和可读性。
需要注意的是,虽然C++14没有新增关键字,但它在语法和标准库方面进行了一些改进和扩展,这些改进和扩展对于提高代码质量和开发效率非常有帮助。
3、C++ 17
C++17中没有新增的关键字,只增加了一些特性和改进。
C++17是C++语言的一个版本,它在C++14的基础上进行了一些改进和扩展,但并没有新增关键字。C++17主要增加了以下特性:
- 结构化绑定(Structured Binding):C++17引入了结构化绑定语法,允许使用多个变量同时从元组或数组中解构。
- 线程局部存储(Thread-Local Storage):C++17允许使用__thread修饰符声明线程局部变量,使得每个线程都有自己的变量副本。
- 范围for循环的初始化(Range-based for loop initialization):C++17允许在范围for循环中使用初始化语句来初始化变量。
- constexpr函数在类的成员函数中使用:C++17允许在类的成员函数中使用constexpr关键字,使得成员函数可以在编译时计算常量值。
- 字符类型的新操作符(New operators for character types):C++17引入了几个新的字符类型操作符,包括std::iswdigit、std::towctrans、std::wctrans等,用于处理宽字符类型的操作。
- 整数类型的改进(Improvements to integer types):C++17对整数类型进行了改进,包括引入了新的整数类型(如std::int128_t、std::uint128_t)和改进了现有整数类型的表示范围和精度。
- 改进的异常处理(Improved exception handling):C++17对异常处理进行了改进,包括引入了noexcept异常规范和改进了异常对象的拷贝行为。
- 类型特性改进(Improvements to type traits):C++17对类型特性库进行了改进,包括扩展了std::is_constructible、std::is_assignable等类型特性模板的用法和增加了新的类型特性模板。
- constexpr改进(Improvements to constexpr):C++17对constexpr进行了改进,包括允许在模板参数中使用constexpr函数和增加了对constexpr构造函数和析构函数的支持。
需要注意的是,虽然C++17没有新增关键字,但它在语法和标准库方面进行了一些改进和扩展,这些改进和扩展对于提高代码质量和开发效率非常有帮助。
4、C++ 20
C++20中新增的关键字包括:
- requires:用于指定函数模板的约束条件。
- constinit:用于指定变量必须用常量初始化。
- consteval:用于在编译时执行常量表达式。
- co_await、co_return、co_yield:用于支持协程操作。
- char8_t:表示8位无符号字符类型。
此外,C++20还引入了一些新特性,包括模块、概念、初始化列表等。其中,模块是一个非常重要的新特性,它改变了传统的头文件包含方式,使得代码更加清晰、易于维护和编译速度更快。
C++20引入了模块的概念,用于解决传统头文件包含机制在编译时间和程序组织方面的问题。
传统的头文件包含机制会导致编译时间增加、标识符冲突等问题。而C++20的模块可以简单地类比为头文件(Header File)+翻译单元(Translation Unit),模块的源文件与导入该模块的翻译单元是独立编译的,因此编译过程中模块只需要编译一次。
在C++20中,可以使用export module关键字声明模块接口单元,该单元可以包含可供导出的C++实体(类、函数、变量等)。在模块接口单元中也可以进行C++实体的定义。此外,还可以使用import关键字导入其他模块的接口单元,以使用该模块中导出的C++实体。
C++20中的模块有以下优点:
- 提高编译速度:由于模块是独立编译的,只有在需要时才编译,从而减少了重复编译的工作量。
- 改善代码组织:通过将代码拆分为不同的模块,可以更好地组织和管理代码,提高代码的可维护性和可读性。
- 减少头文件依赖:模块的使用可以减少头文件的依赖关系,降低头文件之间的耦合度,从而减少名称冲突的可能性。
- 支持静态组件和库:模块可以作为静态组件或库的一部分,方便地集成到应用程序中。
需要注意的是,C++20的模块机制仍然处于实验阶段,某些编译器可能不完全支持该特性。因此,在实际使用中需要注意兼容性问题。
猜你喜欢
- 2024-10-10 C++系列1-1:初探C++ c=2μf
- 2024-10-10 浅谈C++11(第9篇 可变参数模板) c++可变参数模板类
- 2024-10-10 数组的初始化方式有哪几种? 数组的初始化是什么意思
- 2024-10-10 c++对于内建类型的默认初始化 创建内部类的对象
- 2024-10-10 C++类构造函数,如何初始化对象?linux C++第27讲
- 2024-10-10 【C++编程语言】之 类和对象——对象的初始和消除
- 2024-10-10 C++基础语法梳理:引用、封装、继承和多态
- 2024-10-10 C++核心准则?:按照成员声明的顺序定义和初始化成员变量
- 2024-10-10 C++核心准则C.47:按照成员变量声明的次序定义和初始化数据成员
- 2024-10-10 C/C++语言编程系列002——不同情况下数组的初始化方法
- 最近发表
- 标签列表
-
- gitpush (61)
- pythonif (68)
- location.href (57)
- tail-f (57)
- pythonifelse (59)
- deletesql (62)
- c++模板 (62)
- css3动画 (57)
- c#event (59)
- linuxgzip (68)
- 字符串连接 (73)
- nginx配置文件详解 (61)
- html标签 (69)
- c++初始化列表 (64)
- exec命令 (59)
- canvasfilltext (58)
- mysqlinnodbmyisam区别 (63)
- arraylistadd (66)
- node教程 (59)
- console.table (62)
- c++time_t (58)
- phpcookie (58)
- mysqldatesub函数 (63)
- window10java环境变量设置 (66)
- c++虚函数和纯虚函数的区别 (66)