PImpl 惯用法与 C++26 的 std::indirect 类型

来源:mariusbancila.ro — 2026-07-23

📋 概述

PImpl(Pointer to Implementation)是 C++ 中经典的编译防火墙惯用法,通过将实现细节隐藏在 opaque 指针后面来最小化头文件依赖和编译时间。传统实现需要手写完整的五法则(析构函数、拷贝构造、拷贝赋值、移动构造、移动赋值),代码冗长且容易出错。C++26 引入的 std::indirect 类型从根本上简化了这一模式:它是一个值语义的包装器,内部通过指针持有对象,但自动处理所有资源管理——拷贝时自动深拷贝、移动时转移所有权、析构时自动释放。文章以 Widget 类为例对比了传统 raw pointer 实现(需要前向声明 Impl 结构体,在 .cpp 中手写全部五个特殊成员函数)和 C++26 的 std::indirect 版本(只需声明 std::indirect<Impl> 成员,编译器自动生成所有特殊成员)。

🔑 核心要点

💡 金句

Its purpose is to separate interfaces and implementations and minimize compile-time dependencies. ——它的目的是将接口与实现分离,并最小化编译时依赖。
← 返回 Lobsters 首页