C++17 新特性简解

C++17 新特性简解


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

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

cpp 复制代码
#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 初始化语句

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

cpp 复制代码
#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)

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

cpp 复制代码
// 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)

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

cpp 复制代码
#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)

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

cpp 复制代码
#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 扩展

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

cpp 复制代码
#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>
示例

cpp 复制代码
#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 非拥有字符串视图 [见下方]

完整示例

cpp 复制代码
#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>
示例

cpp 复制代码
#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. 嵌套命名空间简化
cpp 复制代码
namespace A::B::C { // 等价于 namespace A { namespace B { namespace C {
    class MyClass {};
}}

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

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

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

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

四、完整可编译代码示例
cpp 复制代码
#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. 编译命令

    bash 复制代码
    g++ -std=c++17 -o cpp17_demo cpp17_demo.cpp -lstdc++fs
相关推荐
ghost14323 分钟前
C#学习第17天:序列化和反序列化
开发语言·学习·c#
愚润求学26 分钟前
【数据结构】红黑树
数据结构·c++·笔记
難釋懷1 小时前
bash的特性-bash中的引号
开发语言·chrome·bash
Hello eveybody2 小时前
C++按位与(&)、按位或(|)和按位异或(^)
开发语言·c++
6v6-博客2 小时前
2024年网站开发语言选择指南:PHP/Java/Node.js/Python如何选型?
java·开发语言·php
Baoing_2 小时前
Next.js项目生成sitemap.xml站点地图
xml·开发语言·javascript
被AI抢饭碗的人2 小时前
c++:c++中的输入输出(二)
开发语言·c++
lqqjuly2 小时前
C++ 面向对象关键语法详解:override、虚函数、转发调用和数组引用传参-策略模式
开发语言·c++
EstrangedZ2 小时前
vcpkg缓存问题研究
c语言·c++·缓存·cmake·vcpkg
喵~来学编程啦2 小时前
【模块化编程】Python文件路径检查、跳转模块
开发语言·python