常量表达式中 Constexpr 函数参数的限制
考虑代码片段:
static constexpr int make_const(const int i){ return i; } void t1(const int i) { constexpr int ii = make_const(i); // error occurs here (i is not a constant expression) std::cout<<ii; }
错误详细信息
尝试使用 make_const(i) 初始化 ii 时,代码会触发错误,因为 i 不是常量表达式。这是因为:
将非 constexpr 参数传递给 constexpr 函数不会产生 constexpr 输出。但是,constexpr 函数可以继承和传播其输入参数的 constexprness。
允许的场景
以下代码可以工作,因为 t1() 和 make_const() 都是带有 constexpr 参数的 constexpr 函数:
constexpr int t1(const int i) { return make_const(i); }
限制
以下代码失败,因为 do_something() 不是 constexpr 函数,即使 make_const() 是:
template<int i> constexpr bool do_something(){ return i; } constexpr int t1(const int i) { return do_something<make_const(i)>(); // error occurs here (i is not a constant expression) }
结论
理解 constexpr 函数和变量之间的区别对于避免此类错误至关重要。 Constexpr 函数提供了在编译时和运行时评估的灵活性,但只能使用 constexpr 参数。
以上是为什么我无法将非 Constexpr 参数传递给 Constexpr 函数?的详细内容。更多信息请关注PHP中文网其他相关文章!