C++编程指南38 - 使用 static_assert 检查类是否符合某个 concept
一:概述
如果我们打算让一个类符合某个 concept,那么尽早验证可以避免给使用者带来麻烦。C++20 引入了 concept(概念),用来对类型(类、结构体等)进行语义约束,例如是否可复制、是否可迭代、是否可调用等等。static_assert
是一种编译时断言,它可以在编译期间验证某个条件是否为真,如果为假,编译器就会报错。
二:示例:
下面是一个示例
class X {
public:X() = delete;X(const X&) = default;X(X&&) = default;X& operator=(const X&) = default;// ...
};// 在某处(例如实现文件中),使用 static_assert 让编译器检查 X 是否符合你期望的属性:static_assert(Default_constructible<X>); // 报错:X 没有默认构造函数
static_assert(Copyable<X>); // 报错:我们忘记定义 X 的移动构造函数
这样做有什么好处:
1. 开发者的意图明确:我们期望类 X 满足某个概念(比如可复制),但可能在实现时漏掉了某个函数(如 move 构造函数)。
2. 用户更少踩坑:别人用我们这个类时,不会在模板实例化或者复杂上下文中才发现“不符合要求”的问题。
3. 静态检查早发现问题:static_assert
会立刻在编译时指出问题,让我们立刻修正,而不是到了模板使用时才“爆雷”。
三:注意事项
这类检查 通常不会写在头文件中,而是放在实现文件(.cpp
)中,避免对外暴露不必要的信息,并防止每次包含头文件都触发这些检查。