CppGuide社区 CppGuide社区
首页
  • 最新谷歌C++风格指南(含C++17/20)
  • C++17详解
  • C++20完全指南
  • C++23快速入门
  • C++语言面试问题集锦
  • 🔥C/C++后端开发常见面试题解析 (opens new window)
  • 网络编程面试题 (opens new window)
  • 网络编程面试题 答案详解 (opens new window)
  • 聊聊WebServer作面试项目那些事儿 (opens new window)
  • 字节跳动面试官现身说 (opens new window)
  • 技术简历指南 (opens new window)
  • 🔥交易系统开发岗位求职与面试指南 (opens new window)
  • 第1章 高频C++11重难点知识解析
  • 第2章 Linux GDB高级调试指南
  • 第3章 C++多线程编程从入门到进阶
  • 第4章 C++网络编程重难点解析
  • 第5章 网络通信故障排查常用命令
  • 第6章 高性能网络通信协议设计精要
  • 第7章 高性能服务结构设计
  • 第8章 Redis网络通信模块源码分析
  • 第9章 后端服务重要模块设计探索
  • 🚀 全部章节.pdf 下载 (opens new window)
  • 源码分析系列

    • leveldb源码分析
    • libevent源码分析
    • Memcached源码分析
    • TeamTalk源码分析
    • 优质源码分享 (opens new window)
    • 🔥远程控制软件gh0st源码分析
  • 从零手写C++项目系列

    • C++游戏编程入门(零基础学C++)
    • 🔥使用C++17从零开发一个调试器 (opens new window)
    • 🔥使用C++20从零构建一个完整的低延迟交易系统 (opens new window)
    • 🔥使用C++从零写一个C语言编译器 (opens new window)
    • 从零用C语言写一个Redis
  • Windows 10系统编程
  • 🔥Linux 5.x内核开发与调试 完全指南 (opens new window)
  • TCP源码实现超详细注释版.pdf (opens new window)
  • Go语言特性

    • Go开发实用指南
    • Go系统接口编程
    • 高效Go并发编程
    • Go性能调优
    • Go项目架构设计
  • Go项目实战

    • 使用Go从零开发一个数据库
    • 🔥使用Go从零开发一个编译器 (opens new window)
    • 🔥使用Go从零开发一个解释器 (opens new window)
    • 🔥用Go从零写一个编排器(类Kubernetes) (opens new window)
  • Rust编程

    • Rust编程指南
  • 数据库

    • SQL零基础指南
    • MySQL开发与调试指南
GitHub (opens new window)
首页
  • 最新谷歌C++风格指南(含C++17/20)
  • C++17详解
  • C++20完全指南
  • C++23快速入门
  • C++语言面试问题集锦
  • 🔥C/C++后端开发常见面试题解析 (opens new window)
  • 网络编程面试题 (opens new window)
  • 网络编程面试题 答案详解 (opens new window)
  • 聊聊WebServer作面试项目那些事儿 (opens new window)
  • 字节跳动面试官现身说 (opens new window)
  • 技术简历指南 (opens new window)
  • 🔥交易系统开发岗位求职与面试指南 (opens new window)
  • 第1章 高频C++11重难点知识解析
  • 第2章 Linux GDB高级调试指南
  • 第3章 C++多线程编程从入门到进阶
  • 第4章 C++网络编程重难点解析
  • 第5章 网络通信故障排查常用命令
  • 第6章 高性能网络通信协议设计精要
  • 第7章 高性能服务结构设计
  • 第8章 Redis网络通信模块源码分析
  • 第9章 后端服务重要模块设计探索
  • 🚀 全部章节.pdf 下载 (opens new window)
  • 源码分析系列

    • leveldb源码分析
    • libevent源码分析
    • Memcached源码分析
    • TeamTalk源码分析
    • 优质源码分享 (opens new window)
    • 🔥远程控制软件gh0st源码分析
  • 从零手写C++项目系列

    • C++游戏编程入门(零基础学C++)
    • 🔥使用C++17从零开发一个调试器 (opens new window)
    • 🔥使用C++20从零构建一个完整的低延迟交易系统 (opens new window)
    • 🔥使用C++从零写一个C语言编译器 (opens new window)
    • 从零用C语言写一个Redis
  • Windows 10系统编程
  • 🔥Linux 5.x内核开发与调试 完全指南 (opens new window)
  • TCP源码实现超详细注释版.pdf (opens new window)
  • Go语言特性

    • Go开发实用指南
    • Go系统接口编程
    • 高效Go并发编程
    • Go性能调优
    • Go项目架构设计
  • Go项目实战

    • 使用Go从零开发一个数据库
    • 🔥使用Go从零开发一个编译器 (opens new window)
    • 🔥使用Go从零开发一个解释器 (opens new window)
    • 🔥用Go从零写一个编排器(类Kubernetes) (opens new window)
  • Rust编程

    • Rust编程指南
  • 数据库

    • SQL零基础指南
    • MySQL开发与调试指南
GitHub (opens new window)
  • C++17 详解 说明
  • 第一部分——语言特性
  • 1. 快速入门
    • 1. 快速入门
      • 操作Maps
      • 调试打印
  • 2. 移除或修正的语言特性
  • 3. 语言澄清(Language Clarification)
  • 4. 通用语言特性
  • 5. 模板(Templates)
  • 6. 代码标注
  • 第二部分 - 标准库的变化
  • 7. std::optional
  • 8. std::variant
  • 9. std::any
  • 10. std::string_view
  • 11. 字符串转换
  • 12. 搜索器与字符串匹配
  • 13. 文件系统
  • 14. 并行STL算法
  • 15. 标准库中的其他变化
  • 16. 移除和弃用的库特性
  • 第三部分 - 更多示例和用例
  • 17. 使用std::optional和std::variant进行重构
  • 18. 使用[[nodiscard]]强制执行代码契约
  • 19. 用if constexpr替换enable_if——带可变参数的工厂函数
  • 20. 如何实现CSV读取器的并行化
目录

1. 快速入门

# 1. 快速入门

为了让你对这个新的标准更感兴趣,下面给出几个代码示例,展示了组合使用的语言特性。

如果你觉得这些示例令人困惑或过于复杂,也不用担心。所有新特性都会在后续章节中逐一深入讲解。

# 操作Maps

Part I/demo_map.cpp

#include <iostream>
#include <map>

int main() {
    std::map<std::string, int> mapUsersAge { { "Alex", 45 }, { "John", 25 } };
    std::map mapCopy{mapUsersAge};

    if (auto [iter, wasAdded] = mapCopy.insert_or_assign("John", 26);!wasAdded)
        std::cout << iter->first << " reassigned...\n ";

    for (const auto& [key, value] : mapCopy)
        std::cout << key << ", " << value << '\n ';
}
1
2
3
4
5
6
7
8
9
10
11
12
13

上述代码的输出结果为:

John reassigned...
Alex, 45
John, 26
1
2
3

上述示例使用了以下特性:

  • 第7行:类模板的模板参数推导(Template Argument Deduction for Class Templates)——mapCopy的类型从mapUsersAge的类型推导得出。无需声明std::map<std::string, int> mapCopy{...}。
  • 第9行:映射的新插入成员函数——insert_or_assign。
  • 第9行:结构化绑定(Structured Bindings)——将insert_or_assign返回的pair解包为不同的变量名。
  • 第9行:if语句的初始化(init if statement)——iter和wasAdded仅在包含该if语句的作用域内可见。
  • 第12行:基于范围的for循环中的结构化绑定——我们可以使用key和value进行迭代,而不是pair.first和pair.second 。

# 调试打印

Part I/demo_print.cpp

#include <iostream>

template <typename T> void linePrinter(const T& x) {
    if constexpr (std::is_integral_v<T>)
        std::cout << "num: " << x << '\n ';
    else if constexpr (std::is_floating_point_v<T>) {
        const auto frac = x - static_cast<long>(x);
        std::cout << "flt: " << x << ", frac " << frac << '\n ';
    }
    else if constexpr(std::is_pointer_v<T>) {
        std::cout << "ptr, ";
        linePrinter(*x);
    }
    else
        std::cout << x << '\n ';
}

template <typename... Args> void printWithInfo(Args... args) {
    (linePrinter(args),...); // 逗号运算符上的折叠表达式
}

int main () {
    int i = 10;
    float f = 2.56f;
    printWithInfo(&i, &f, 30);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26

上述代码的输出结果为:

ptr, num: 10
ptr, flt: 2.56, frac 0.56
num: 30
1
2
3

在这里,你可以看到以下特性:

  • 第4、6、10行:if constexpr——用于在编译时舍弃代码,以匹配模板参数。
  • 第4、6、10行:用于类型特性的_v变量模板——无需编写std::trait_name<T>::value。
  • 第19行:printWithInfo函数中的折叠表达式(Fold Expressions)。这个特性简化了可变参数模板。在示例中,我们对所有输入参数调用linePrinter() 。

让我们开始吧!

到目前为止你看到的代码只是冰山一角!继续阅读,你将看到更多内容:语言中的修正、说明、移除的内容(比如auto_ptr),当然还有新内容:常量表达式lambda表达式(constexpr lambda)、if constexpr、折叠表达式、结构化绑定、template<auto>、内联变量、类模板的模板参数推导等等!

#C++17#C/C++开发
上次更新: 2025/04/01, 13:21:34
第一部分——语言特性
2. 移除或修正的语言特性

← 第一部分——语言特性 2. 移除或修正的语言特性→

最近更新
01
第二章 关键字static及其不同用法
03-27
02
第一章 auto与类型推导
03-27
03
第四章 Lambda函数
03-27
更多文章>
Copyright © 2024-2025 沪ICP备2023015129号 张小方 版权所有
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式