为何this->isTrue<int>()无法作为常量表达式被求值?
constexpr if条件非常量表达式的原因分析
问题代码
#include <type_traits> struct serialiser_deserialiser { template <typename U> void read_or_write(U& obj_to_write) { if constexpr (this->isTrue<int>()) { } } template <typename T> constexpr bool isTrue() const { return true; } }; int main() { serialiser_deserialiser serialiser_obj; int a; serialiser_obj.read_or_write(a); }
错误信息
error: constexpr if condition is not a constant expression
原因解析
constexpr if要求条件必须是编译阶段就能确定值的常量表达式,你遇到的问题核心是:
- 调用
this->isTrue<int>()时,this指向的是main里创建的运行期对象serialiser_obj——哪怕isTrue是constexpr成员函数,只要通过非constexpr对象调用,这个调用就无法被编译器视为编译期常量。 isTrue是模板函数这一点不是问题根源,哪怕它不是模板,只要通过运行期对象的this调用,同样会触发这个错误。
修复方案
有两种简单的修复方式:
- 将
isTrue改为静态成员函数,摆脱对this的依赖:
template <typename T> static constexpr bool isTrue() { return true; } // 调用时改为:serialiser_deserialiser::isTrue<int>()
- 将
serialiser_obj声明为constexpr对象,让它成为编译期实体:
constexpr serialiser_deserialiser serialiser_obj;
内容的提问来源于stack exchange,提问作者Zebrafish
相关产品推荐
相关产品推荐

