登錄 |創建賬號 |找回密碼
查看: 95|回復: 1

[通用] c++14和c++17和c++20 相比c++11 都有那些新的特性

[複製鏈接]

23

主題

6

回帖

130

積分

管理員

Rank: 9Rank: 9Rank: 9

積分
130
發表於 2024-3-29 20:30:02 | 顯示全部樓層 |閱讀模式
C++11是一次重大更新,引入了许多新特性,如lambda表达式、自动类型推断、移动语义、智能指针等。后续的C++标准,包括C++14、C++17和C++20,都在此基础上进行了增强和改进,引入了新特性和改进现有特性,以提高语言的可用性、性能、可靠性和一致性。下面是从C++11到C++20的一些关键新特性概述:
C++14的新特性
  • [color=var(--tw-prose-bold)]泛型Lambda表达式:允许lambda表达式的参数使用auto关键字。
  • [color=var(--tw-prose-bold)]返回类型推断:函数和lambda表达式可以自动推断返回类型。
  • [color=var(--tw-prose-bold)]二进制字面量:允许直接使用二进制形式表示整数。
  • [color=var(--tw-prose-bold)]数字分隔符:改善数值字面量的可读性。
  • [color=var(--tw-prose-bold)]标准化的属性语法:引入了一种标准方式来定义属性,比如[[deprecated]]和[[nodiscard]]。
  • [color=var(--tw-prose-bold)]编译时整数序列:引入std::integer_sequence和std::make_integer_sequence。
C++17的新特性
  • [color=var(--tw-prose-bold)]结构化绑定:允许从数组或tuple中一次性解包多个值。
  • [color=var(--tw-prose-bold)]内联变量:允许在头文件中定义内联变量,以避免多个定义错误。
  • [color=var(--tw-prose-bold)]折叠表达式:简化了可变参数模板的操作。
  • [color=var(--tw-prose-bold)]if和switch的初始化语句:允许在if和switch语句中进行变量初始化。
  • [color=var(--tw-prose-bold)]std:ptional:提供了一种安全的方式来处理可能未初始化的值。
  • [color=var(--tw-prose-bold)]std::variant和std::visit:提供了一种类型安全的联合体。
  • [color=var(--tw-prose-bold)]文件系统库:标准化的文件系统访问接口。
C++20的新特性
  • [color=var(--tw-prose-bold)]概念和约束:引入了概念(Concepts),为模板引入了一种约束机制,以简化模板代码和提高编译器错误信息的可读性。
  • [color=var(--tw-prose-bold)]三路比较运算符(Spaceship Operator):<=>提供了一种标准方式来定义对象比较的结果。
  • [color=var(--tw-prose-bold)]协程:引入了语言级别的支持,允许异步编程和更高效的异步任务管理。
  • [color=var(--tw-prose-bold)]范围库:引入了Ranges,提供了一种新的方式来操作和查询容器。
  • [color=var(--tw-prose-bold)]模块:引入了模块的概念,以改善C++程序的编译时间和模块化。
  • [color=var(--tw-prose-bold)]consteval和constexpr函数:引入了consteval关键字来指定函数必须在编译时计算,以及对constexpr函数的扩展,使其更加灵活和强大。
  • [color=var(--tw-prose-bold)]聚合初始化的扩展:改进了结构体和数组的初始化方式。
这些是各个标准新增特性的概览。每个新标准都旨在解决特定的编程问题,提供更多的语言特性,以及改进现有的语言结构和库,从而使C++成为一种更加强大、灵活和高效的编程语言。

回復

使用道具 舉報

23

主題

6

回帖

130

積分

管理員

Rank: 9Rank: 9Rank: 9

積分
130
 樓主| 發表於 2024-3-29 20:33:48 | 顯示全部樓層
C++14 特性示例
泛型Lambda表达式
  1. auto lambda = [](auto x, auto y) { return x + y; };
  2. std::cout << lambda(1, 2) << std::endl; // 输出: 3
  3. std::cout << lambda(1.1, 2.2) << std::endl; // 输出: 3.3
複製代碼

返回类型推断
  1. auto func() {
  2.     return 4.5; // 返回类型是double,由编译器推断
  3. }
複製代碼


二进制字面量和数字分隔符
  1. auto binary = 0b0011'1010; // 二进制字面量,等于十进制的58
複製代碼


C++17 特性示例结构化绑定
  1. std::pair<int, double> p = {1, 2.3};
  2. auto [i, d] = p;
  3. std::cout << i << ", " << d << std::endl; // 输出: 1, 2.3
複製代碼


内联变量
  1. // header.hpp
  2. inline const std::string HeaderValue = "Inline Header";

  3. // main.cpp
  4. std::cout << HeaderValue << std::endl;
複製代碼


std:ptional
  1. std::optional<int> func(bool flag) {
  2.     if (flag) return 1;
  3.     else return std::nullopt;
  4. }

  5. auto result = func(false);
  6. if (!result) {
  7.     std::cout << "No value" << std::endl; // 这将被执行
  8. }
複製代碼


C++20 特性示例概念和约束
  1. template<typename T>
  2. requires std::integral<T>
  3. T add(T a, T b) {
  4.     return a + b;
  5. }
複製代碼


三路比较运算符(Spaceship Operator)
  1. struct MyInt {
  2.     int value;
  3.     auto operator<=>(const MyInt&) const = default;
  4. };

  5. MyInt a{5}, b{10};
  6. std::cout << ((a < b) ? "a < b" : "a >= b") << std::endl; // 输出: a < b
複製代碼


协程
  1. std::future<int> asyncFunc() {
  2.     co_return 42;
  3. }
複製代碼


范围库
  1. #include <ranges>
  2. #include <vector>
  3. #include <iostream>

  4. int main() {
  5.     std::vector<int> v = {1, 2, 3, 4, 5, 6};
  6.     for (auto i : v | std::views::filter([](int x) { return x % 2 == 0; })
  7.                       | std::views::transform([](int x) { return x * x; })) {
  8.         std::cout << i << " "; // 输出: 4 16 36
  9.     }
  10. }
複製代碼



回復

使用道具 舉報

您需要登錄後才可以回帖 登錄 | 創建賬號

本版積分規則

Archiver|手機版|小黑屋|九派社區 ( 苏ICP备07501547号-12 )

GMT+8, 2024-5-21 10:35 , Processed in 0.055649 second(s), 18 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回復 返回頂部 返回列表