首页  >  文章  >  后端开发  >  为什么我无法将非 Constexpr 参数传递给 Constexpr 函数?

为什么我无法将非 Constexpr 参数传递给 Constexpr 函数?

Susan Sarandon
Susan Sarandon原创
2024-11-15 08:57:02537浏览

Why Can't I Pass Non-Constexpr Arguments to a Constexpr Function?

Limitations of Constexpr Function Parameters in Constant Expressions

Consider the code snippet:

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;
}

Error Details

The code triggers an error when attempting to initialize ii with make_const(i) because i is not a constant expression. This is because:

  • A constexpr variable is a variable with a value guaranteed to be available at compile time.
  • A constexpr function is a function that evaluates at compile time when provided with constexpr arguments.

Passing a non-constexpr parameter to a constexpr function does not result in a constexpr output. However, the constexpr function can inherit and propagate the constexprness of its input parameters.

Allowed Scenarios

The following code works because both t1() and make_const() are constexpr functions with constexpr parameters:

constexpr int t1(const int i)
{
    return make_const(i);
}

Limitations

The following code fails because do_something() is not a constexpr function, even though make_const() is:

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)
}

Conclusion

Understanding the distinction between constexpr functions and variables is crucial to avoid such errors. Constexpr functions offer the flexibility of being evaluated at both compile-time and run-time, but only with constexpr arguments.

以上是为什么我无法将非 Constexpr 参数传递给 Constexpr 函数?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn