C++17 新特性简解

news2025/4/24 4:18:22

C++17 新特性简解


一、核心语言特性
1. 结构化绑定(Structured Bindings)

用途:解构复合类型(如元组、结构体)为独立变量
示例

#include <iostream>
#include <tuple>

int main() {
    // 解构 std::pair
    std::pair<int, double> p{42, 3.14};
    auto [x, y] = p;
    std::cout << "Pair: " << x << ", " << y << "\n";

    // 解构结构体
    struct Point { int a; int b; };
    Point pt{10, 20};
    auto& [a, b] = pt; // 引用绑定
    a = 100;
    std::cout << "Point: " << pt.a << ", " << pt.b << "\n";
    return 0;
}
2. if/switch 初始化语句

用途:在条件语句中声明临时变量,限制作用域
示例

#include <iostream>
#include <vector>

int getValue() { return 42; }

int main() {
    std::vector<int> vec{1, 2, 3};

    // if 初始化
    if (auto it = std::find(vec.begin(), vec.end(), 2); it != vec.end()) {
        std::cout << "Found: " << *it << "\n";
    }

    // switch 初始化
    switch (int key = getValue(); key) {
        case 42: std::cout << "Answer\n"; break;
        default: break;
    }
    return 0;
}
3. 内联变量(Inline Variables)

用途:允许头文件中直接定义全局变量
示例

// header.h
inline int globalCount = 0; // 多文件包含安全

struct MyClass {
    inline static int instanceCount = 0; // 类内初始化静态成员
};

// main.cpp
#include <iostream>
#include "header.h"

int main() {
    MyClass::instanceCount++;
    std::cout << "Global: " << globalCount << ", Instance: " << MyClass::instanceCount << "\n";
    return 0;
}
4. 折叠表达式(Fold Expressions)

用途:简化可变参数模板展开
示例

#include <iostream>

template<typename... Args>
auto sum(Args... args) {
    return (args + ...); // 折叠求和
}

int main() {
    std::cout << "Sum: " << sum(1, 2, 3, 4) << "\n"; // 输出 10
    return 0;
}
5. 类模板参数推导(CTAD)

用途:自动推导模板参数类型
示例

#include <vector>
#include <tuple>

int main() {
    std::pair p{1, "hello"};    // 推导为 pair<int, const char*>
    std::vector v{1, 2, 3};     // 推导为 vector<int>
    std::tuple t{4, 3.14, "π"}; // 推导为 tuple<int, double, const char*>
    return 0;
}
6. constexpr 扩展

用途:支持更多编译期计算
示例

#include <iostream>

constexpr int factorial(int n) {
    if (n <= 1) return 1;
    return n * factorial(n - 1);
}

int main() {
    constexpr int val = factorial(5);
    static_assert(val == 120); // 编译期验证
    std::cout << "5! = " << val << "\n";
    return 0;
}

二、标准库增强
1. 文件系统库(Filesystem)

头文件<filesystem>
示例

#include <iostream>
#include <filesystem>

namespace fs = std::filesystem;

int main() {
    fs::path p = fs::current_path() / "test.txt";
    if (fs::exists(p)) {
        std::cout << "文件大小: " << fs::file_size(p) << "字节\n";
    }
    return 0;
}
2. 新容器类型
类型用途示例代码
std::optional<T>表示可能不存在的值[见下方]
std::variant<T...>类型安全的联合体[见下方]
std::any存储任意类型[见下方]
std::string_view非拥有字符串视图[见下方]

完整示例

#include <iostream>
#include <optional>
#include <variant>
#include <any>
#include <string_view>

int main() {
    // optional
    std::optional<int> opt = 42;
    if (opt) std::cout << "Optional: " << *opt << "\n";

    // variant
    std::variant<int, std::string> v = "hello";
    std::cout << "Variant: " << std::get<std::string>(v) << "\n";

    // any
    std::any a = 3.14;
    if (a.type() == typeid(double)) {
        std::cout << "Any: " << std::any_cast<double>(a) << "\n";
    }

    // string_view
    std::string_view sv = "Hello World";
    std::cout << "View: " << sv.substr(0, 5) << "\n";
    return 0;
}
3. 并行算法

头文件<execution>
示例

#include <iostream>
#include <vector>
#include <algorithm>
#include <execution>

int main() {
    std::vector<int> data{5, 3, 1, 4, 2};

    // 并行排序
    std::sort(std::execution::par, data.begin(), data.end());

    // 并行遍历
    std::for_each(std::execution::par, data.begin(), data.end(), [](int x) {
        std::cout << x << " ";
    });
    return 0;
}

三、其他改进
1. 嵌套命名空间简化
namespace A::B::C { // 等价于 namespace A { namespace B { namespace C {
    class MyClass {};
}}

int main() {
    A::B::C::MyClass obj;
    return 0;
}
2. 强制复制省略
struct NonCopyable {
    NonCopyable() = default;
    NonCopyable(const NonCopyable&) = delete;
};

NonCopyable create() {
    return NonCopyable{}; // C++17 必须省略拷贝
}

int main() {
    NonCopyable obj = create();
    return 0;
}
3. 新增属性
[[nodiscard]] int critical() { return 42; }

int main() {
    critical(); // 警告:返回值未使用
    return 0;
}

四、完整可编译代码示例
#include <iostream>
#include <tuple>
#include <vector>
#include <filesystem>
#include <optional>
#include <algorithm>
#include <execution>

// 结构化绑定
void demo_structured_binding() {
    auto [x, y] = std::make_tuple(42, 3.14);
    std::cout << "Tuple: " << x << ", " << y << "\n";
}

// 文件系统
void demo_filesystem() {
    namespace fs = std::filesystem;
    fs::path p = fs::current_path();
    std::cout << "当前路径: " << p << "\n";
}

// 并行算法
void demo_parallel() {
    std::vector<int> data{5, 3, 1, 4, 2};
    std::sort(std::execution::par, data.begin(), data.end());
    for (int n : data) std::cout << n << " ";
}

int main() {
    demo_structured_binding();
    demo_filesystem();
    demo_parallel();
    return 0;
}

五、编译与运行
  1. 编译命令
    g++ -std=c++17 -o cpp17_demo cpp17_demo.cpp -lstdc++fs
    

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2341200.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Mujoco robosuite 机器人模型

import ctypes import os# 获取当前脚本所在的目录 script_dir os.path.dirname(os.path.abspath(__file__))# 构建库文件的相对路径 lib_relative_path os.path.join(dynamic_models, UR5e, Jb.so)# 拼接成完整的路径 lib_path os.path.join(script_dir, lib_relative_path…

K8s:概念、特点、核心组件与简单应用

一、引言 在当今云计算和容器技术蓬勃发展的时代&#xff0c;Kubernetes&#xff08;简称 K8s&#xff09;已成为容器编排领域的事实标准。它为管理容器化应用提供了高效、可靠的解决方案&#xff0c;极大地简化了应用的部署、扩展和运维过程。无论是小型初创公司还是大型企业…

STM32的定时器输出PWM时,死区时间(DTR)如何计算

在 STM32F429&#xff08;以及所有 STM32F4 “高级定时器”&#xff09;中&#xff0c;死区时间由 TIMx_BDTR 寄存器的 8 位 “Dead‑Time Generator” 字段 DTG[7:0] 来配置。其计算分三步&#xff1a; 计算死区时钟周期 tDTS TIM1 时钟源为 APB2 定时器时钟&#xff08;PCL…

STC32G12K128单片机GPIO模式SPI操作NorFlash并实现FatFS文件系统

STC32G12K128单片机GPIO模式SPI操作NorFlash并实现FatFS文件系统 NorFlash简介NorFlash操作驱动代码文件系统测试代码 NorFlash简介 NOR Flash是一种类型的非易失性存储器&#xff0c;它允许在不移除电源的情况下保留数据。NOR Flash的名字来源于其内部结构中使用的NOR逻辑门。…

ClickHouse 设计与细节

1. 引言 ClickHouse 是一款备受欢迎的开源列式在线分析处理 (OLAP) 数据库管理系统&#xff0c;专为在海量数据集上实现高性能实时分析而设计&#xff0c;并具备极高的数据摄取速率 1。其在各种行业中得到了广泛应用&#xff0c;包括众多知名企业&#xff0c;例如超过半数的财…

智能体MCP 实现数据可视化分析

参考: 在线体验 https://www.doubao.com/chat/ 下载安装离线体验 WPS软件上的表格分析 云上创建 阿里mcp:https://developer.aliyun.com/article/1661198 (搜索加可视化) 案例 用cline 或者cherry studio实现 mcp server:excel-mcp-server、quickchart-mcp-server

再看开源多模态RAG的视觉文档(OCR-Free)检索增强生成方案-VDocRAG

前期几个工作提到&#xff0c;基于OCR的文档解析RAG的方式进行知识库问答&#xff0c;受限文档结构复杂多样&#xff0c;各个环节的解析泛化能力较差&#xff0c;无法完美的对文档进行解析。因此出现了一些基于多模态大模型的RAG方案。如下&#xff1a; 【RAG&多模态】多模…

深入浅出 NVIDIA CUDA 架构与并行计算技术

&#x1f407;明明跟你说过&#xff1a;个人主页 &#x1f3c5;个人专栏&#xff1a;《深度探秘&#xff1a;AI界的007》 &#x1f3c5; &#x1f516;行路有良友&#xff0c;便是天堂&#x1f516; 目录 一、引言 1、CUDA为何重要&#xff1a;并行计算的时代 2、NVIDIA在…

FPGA系列之DDS信号发生器设计(DE2-115开发板)

一、IP核 IP(Intellectual Property)原指知识产权、著作权等&#xff0c;在IC设计领域通常被理解为实现某种功能的设计。IP模块则是完成某种比较复杂算法或功能&#xff08;如FIR滤波器、FFT、SDRAM控制器、PCIe接口、CPU核等&#xff09;并且参数可修改的电路模块&#xff0c…

【Dv3Admin】从零搭建Git项目安装·配置·初始化

项目采用 Django 与 Vue3 技术栈构建&#xff0c;具备强大的后端扩展能力与现代前端交互体验。完整实现了权限管理、任务队列、WebSocket 通信、系统配置等功能&#xff0c;适用于构建中后台管理系统与多租户平台。 本文章内容涵盖环境搭建、虚拟环境配置、前后端部署、项目结…

P3416-图论-法1.BFS / 法2.Floyd

这道题虽然标签有floyd但是直接bfs也能过 其实事实证明还是bfs快&#xff0c;因为bfs只需要遍历特定的点&#xff0c;但是floyd需要考虑遍历所有可能的中介点 法1.BFS 用字典存储每个点所能普及的范围&#xff0c;然后用对每个点bfs进行拓展 nint(input())temp[]#xmax0;yma…

极狐GitLab 议题和史诗创建的速率限制如何设置?

极狐GitLab 是 GitLab 在中国的发行版&#xff0c;关于中文参考文档和资料有&#xff1a; 极狐GitLab 中文文档极狐GitLab 中文论坛极狐GitLab 官网 议题和史诗创建的速率限制 (BASIC SELF) 速率限制是为了控制新史诗和议题的创建速度。例如&#xff0c;如果您将限制设置为 …

提交到Gitee仓库

文章目录 注册配置公钥创建空白的码云仓库把本地项目上传到码云对应的空白仓库中 注册 注册并激活码云账号&#xff08; 注册页面地址&#xff1a;https://gitee.com/signup &#xff09; 可以在自己C盘/用户/用户名/.ssh 可以看到 有id_rsa.pub 以前在GitHub注册时搞过&…

oracle中错误总结

oracle中给表起别名不能用as&#xff0c;用as报错 在 Oracle 数据库中&#xff0c;​​WITH 子句&#xff08;即 CTE&#xff0c;公共表表达式&#xff09;允许后续定义的子查询引用前面已经定义的 CTE​​&#xff0c;但 ​​前面的 CTE 无法引用后面的 CTE​​。这种设计类似…

纽约大学具身智能体在城市空间中的视觉导航之旅!CityWalker:从海量网络视频中学习城市导航

作者&#xff1a;Xinhao Liu, Jintong Li, Yicheng Jiang, Niranjan Sujay, Zhicheng Yang, Juexiao Zhang, John Abanes, Jing Zhang, Chen Feng单位&#xff1a;纽约大学论文标题&#xff1a;CityWalker: Learning Embodied Urban Navigation from Web-Scale Videos论文链接&…

OpenCV颜色变换cvtColor

OpenCV计算机视觉开发实践&#xff1a;基于Qt C - 商品搜索 - 京东 颜色变换是imgproc模块中一个常用的功能。我们生活中看到的大多数彩色图片都是RGB类型的&#xff0c;但是在进行图像处理时需要用到灰度图、二值图、HSV&#xff08;六角锥体模型&#xff0c;这个模型中颜色的…

Manus技术架构、实现内幕及分布式智能体项目实战

Manus技术架构、实现内幕及分布式智能体项目实战 模块一&#xff1a; 剖析Manus分布式多智能体全生命周期、九大核心模块及MCP协议&#xff0c;构建低幻觉、高效且具备动态失败处理能力的Manus系统。 模块二&#xff1a; 解析Manus大模型Agent操作电脑的原理与关键API&#xf…

下载油管视频 - yt-dlp

文章目录 1. yt-dlp与you-get介绍1.1 主要功能对比1.2 使用场景1.3 安装 2. 基本命令介绍2.1 默认下载视频2.2 指定画质和格式规则2.3 下载播放列表2.4 备注 3. 参考资料 之前只使用you-get下载b站视频&#xff0c;当时了解you-get也可下载油管视频&#xff0c;但之前无此需求&…

济南通过首个备案生活服务大模型,打造行业新标杆

近日&#xff0c;一则振奋人心的消息在人工智能领域传开&#xff1a;济南本土企业丽阳神州智能科技有限公司自主研发的 “丽阳雨露” 大模型成功通过国家网信办的备案。这一成果不仅是济南企业在科技创新道路上的重大突破&#xff0c;更标志着我国在生活服务领域的人工智能应用…

第6次课 贪心算法 A

向日葵朝着太阳转动&#xff0c;时刻追求自身成长的最大可能。 贪心策略在一轮轮的简单选择中&#xff0c;逐步导向最佳答案。 课堂学习 引入 贪心算法&#xff08;英语&#xff1a;greedy algorithm&#xff09;&#xff0c;是用计算机来模拟一个「贪心」的人做出决策的过程…