一、语言层面新特性(语法、类、模板、控制流)
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 初始化语句
在 if、switch 条件内定义局部变量,作用域仅限分支
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. 类特性扩展
- 聚合类允许有基类 :简单继承结构也能
{}初始化 - 继承构造函数支持访问控制
- 无参
new不再默认初始化(值初始化规则调整)
11. 弃用、移除特性
- 移除三目运算符替代符
<% %>、and/or等替代关键字保留但废弃老式写法 - 移除
register关键字 - 弃用动态异常规范
throw()
12. 其他语法小更新
-
[[nodiscard]]标准属性:标记返回值不可忽略,编译警告cpp
运行
[[nodiscard]] int GetValue(); -
[[maybe_unused]]:消除未使用变量 / 函数警告 -
[[fallthrough]]:switch case 故意穿透无 break,消除警告
二、标准库 STL 新增组件(UE 限制使用,但标准 C++17 包含)
1. 容器新增
std::variant<Ts...>变体类型:存储多种类型其中一种,安全联合体std::optional<T>可空值类型,替代裸指针存可选数据std::any任意类型容器,类型擦除,可存任意单对象
2. 工具类
std::tuple辅助:std::apply将 tuple 参数解包传入函数std::size、std::empty、std::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 放开大量限制:
- constexpr 函数可包含 if、switch、循环、局部变量
- constexpr 支持构造函数、析构函数
- 容器
std::array可完全在编译期构造、遍历修改 - 字符串字面量、简单容器可作为 constexpr 常量
四、和 UE5.7 开发的关联重点
- UE 默认启用 C++17,但禁止大量使用 STL :
- 不推荐
std::vector/std::string/std::variant/std::filesystem - 引擎自有替代:
TArray/FString/TOptional
- 不推荐
- 允许安全使用的 C++17 特性:
- 结构化绑定、if 初始化、constexpr if、折叠表达式、CTAD、
[[nodiscard]]属性 std::tuple、std::type_traits元编程工具
- 结构化绑定、if 初始化、constexpr if、折叠表达式、CTAD、
- 禁用风险点:
std::any/std::variant/std::optional容易和 UE GC、内存分配冲突<filesystem>引擎封装了IPlatformFile,优先用引擎接口- 并行算法
std::execution会绕开 UE 任务调度,多线程同步风险高
五、C++17 对比 C++14 核心优势速记
- 代码更简洁:结构化绑定、if 初始化、嵌套命名空间简写
- 编译期计算更强:constexpr lambda、constexpr if、折叠表达式
- 安全类型:optional/variant/any 替代裸指针、不安全联合体
- 工具完善:标准文件系统、并行算法、标准属性
- 头文件工程优化:inline variable 解决静态变量多重定义问题