constexpr析构函数的生效规则及模板场景下的编译逻辑疑问
问题解答
你提到的两个问题结论都和constexpr构造函数的规则完全一致,具体规则如下:
- 针对模板类的
constexpr析构函数,C++标准仅要求存在至少一组模板参数,使得该析构函数实例化后符合常量表达式的所有要求,这个constexpr声明本身就是合法的,不会直接触发编译错误。 - 对于无法满足常量表达式要求的模板参数实例化场景,只要你没有在常量表达式上下文内主动调用该实例的析构函数,代码就可以正常编译运行,只有当你尝试在常量表达式场景下调用这类不符合要求的析构函数时,才会报错。
示例代码参考
#include <type_traits> template<typename T> struct Demo { constexpr ~Demo() requires std::is_trivially_destructible_v<T> = default; ~Demo() = default; }; // 运行时场景使用非平凡可析构类型,编译正常 void runtime_use() { Demo<std::string> d; } // 常量表达式场景仅能使用符合要求的特化 constexpr void constexpr_use() { Demo<int> d; // Demo<std::string> d2; // 放开后会编译报错:常量表达式上下文内调用了非constexpr析构 }
补充说明:非模板类的场景规则略有不同,如果是非模板类声明了constexpr析构函数,那么该析构函数必须无条件符合常量表达式要求,否则会直接编译报错。
内容的提问来源于stack exchange,提问作者wehin19066
相关产品推荐
相关产品推荐

