C++17 完整核心特性清单

一、语言层面新特性(语法、类、模板、控制流)

1. 结构化绑定 Structured Bindings

一次性解包元组、pair、数组、自定义结构体,不用 .first/.second

cpp

运行

复制代码
std::pair<int, std::string> p = {1, "ue5"};
auto [id, name] = p;

struct Vec { float x, y; };
Vec v{1,2};
auto [a,b] = v;

2. if /switch 初始化语句

ifswitch 条件内定义局部变量,作用域仅限分支

cpp

运行

复制代码
// if内创建变量
if (auto ptr = GetObject(); ptr != nullptr)
{
    ptr->DoWork();
}

// switch同理
switch (auto val = GetEnum(); val)
{
    case 1: break;
}

3. 内联变量 inline variables

头文件定义静态全局变量 / 静态成员,多文件链接不重定义报错,替代头文件静态常量 workaround

cpp

运行

复制代码
// .h 中直接定义
inline int GlobalVersion = 57;

struct UMath
{
    static inline float Pi = 3.1415f;
};

4. constexpr lambda 常量表达式 lambda

lambda 可在编译期执行,放入 constexpr 上下文

cpp

运行

复制代码
constexpr auto Square = [](int x) { return x*x; };
static_assert(Square(5) == 25);

5. 折叠表达式 Fold Expressions

简化可变参数模板参数展开,处理一堆参数求和、拼接、逻辑判断

cpp

运行

复制代码
template<typename... Args>
auto Sum(Args... args)
{
    return (... + args); // 一元左折叠
}
Sum(1,2,3,4); // 10

6. 类模板参数推导 CTAD

创建对象时不用显式写模板参数,编译器自动推导

cpp

运行

复制代码
// C++11/14 需要 vector<int>{1,2}
std::vector vec{1,2,3}; // C++17自动推导vector<int>
std::pair p{1, "ue"};

7. constexpr if 编译期分支

编译期判断,不满足分支直接丢弃不编译,常用于模板多平台分支

cpp

运行

复制代码
template<typename T>
void Func(T t)
{
    if constexpr (std::is_integral_v<T>)
    {
        // 只有整型才编译这段
    }
    else
    {
        // 浮点编译这段
    }
}

8. 简化嵌套命名空间

cpp

运行

复制代码
// C++11 要逐层写
namespace A { namespace B { namespace C {} } }
// C++17 简写
namespace A::B::C
{
}

9. 允许 using 声明多条别名逗号分隔

cpp

运行

复制代码
using Int = int, Float = float;

10. 类特性扩展

  1. 聚合类允许有基类 :简单继承结构也能 {} 初始化
  2. 继承构造函数支持访问控制
  3. 无参 new 不再默认初始化(值初始化规则调整)

11. 弃用、移除特性

  • 移除三目运算符替代符 <% %>and/or 等替代关键字保留但废弃老式写法
  • 移除 register 关键字
  • 弃用动态异常规范 throw()

12. 其他语法小更新

  • [[nodiscard]] 标准属性:标记返回值不可忽略,编译警告

    cpp

    运行

    复制代码
    [[nodiscard]] int GetValue();
  • [[maybe_unused]]:消除未使用变量 / 函数警告

  • [[fallthrough]]:switch case 故意穿透无 break,消除警告

二、标准库 STL 新增组件(UE 限制使用,但标准 C++17 包含)

1. 容器新增

  1. std::variant<Ts...> 变体类型:存储多种类型其中一种,安全联合体
  2. std::optional<T> 可空值类型,替代裸指针存可选数据
  3. std::any 任意类型容器,类型擦除,可存任意单对象

2. 工具类

  • std::tuple 辅助:std::apply 将 tuple 参数解包传入函数
  • std::sizestd::emptystd::data 全局统一接口,兼容数组 / 容器
  • std::byte 独立字节类型,区别于 char,专门处理二进制数据

3. 并行算法(<algorithm>

所有标准算法新增执行策略参数:

  • std::execution::seq 串行(默认)
  • std::execution::par 多线程并行

cpp

运行

复制代码
std::vector<int> arr{1,2,3};
std::sort(std::execution::par, arr.begin(), arr.end());

4. 文件系统库 <filesystem>

跨平台文件、目录、路径操作:路径拼接、遍历文件夹、创建删除文件、获取文件属性,替代系统 API。

5. 数学、数值增强

  • 完整 constexpr 数学函数
  • 整数公约数 std::gcd、最小公倍数 std::lcm
  • 数值转换安全函数 std::to_chars / std::from_chars,无堆分配快速数字字符串互转

6. 内存智能指针补充

  • std::shared_ptr 支持数组管理 shared_ptr<T[]>
  • 分配器优化、内存资源池 std::pmr(多态内存资源,用于自定义内存池)

三、常量表达式 constexpr 大幅增强

C++11 constexpr 限制极多,C++17 放开大量限制:

  1. constexpr 函数可包含 if、switch、循环、局部变量
  2. constexpr 支持构造函数、析构函数
  3. 容器 std::array 可完全在编译期构造、遍历修改
  4. 字符串字面量、简单容器可作为 constexpr 常量

四、和 UE5.7 开发的关联重点

  1. UE 默认启用 C++17,但禁止大量使用 STL
    • 不推荐 std::vector/std::string/std::variant/std::filesystem
    • 引擎自有替代:TArray/FString/TOptional
  2. 允许安全使用的 C++17 特性:
    • 结构化绑定、if 初始化、constexpr if、折叠表达式、CTAD、[[nodiscard]] 属性
    • std::tuplestd::type_traits 元编程工具
  3. 禁用风险点:
    • std::any/std::variant/std::optional 容易和 UE GC、内存分配冲突
    • <filesystem> 引擎封装了 IPlatformFile,优先用引擎接口
    • 并行算法 std::execution 会绕开 UE 任务调度,多线程同步风险高

五、C++17 对比 C++14 核心优势速记

  1. 代码更简洁:结构化绑定、if 初始化、嵌套命名空间简写
  2. 编译期计算更强:constexpr lambda、constexpr if、折叠表达式
  3. 安全类型:optional/variant/any 替代裸指针、不安全联合体
  4. 工具完善:标准文件系统、并行算法、标准属性
  5. 头文件工程优化:inline variable 解决静态变量多重定义问题