C ++ 11 constexpr函数传递参数

时间:2014-05-09 16:09:49

标签: c++ c++11 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;
}

int main()
{
   t1(12);
}

为什么我在make_const上遇到错误?


更新

但是这个有效:

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

然而,这不是:

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

3 个答案:

答案 0 :(得分:12)

constexpr函数与constexpr变量相关但不同。

constexpr变量是一个变量,其值保证在编译时可用。

constexpr函数是一个函数,如果使用constexpr参数进行求值,在执行期间“正确”运行,将在编译时进行评估。

如果您将非constexpr int传递给constexpr函数,它将无法在编译时进行神奇的评估。但是,它将被允许通过其自身传递其输入参数的constexpr(正常函数不能这样做)。

关于函数的

constexpr是文档和对它们如何编写的限制以及对编译器的指令的混合。

这背后的原因是允许在编译时和运行时评估相同的函数。如果传递运行时参数,则它是运行时函数。如果传递了constexpr个参数,则可以在编译时对其进行求值(如果在某些上下文中使用,则会被评估)。

答案 1 :(得分:6)

constconstexpr之间的一个重要区别是,constexpr可以在编译时进行评估。

通过编写constexpr int ii = make_const(i);,您告诉编译器该表达式将在编译时进行评估。由于i是在运行时进行评估的,因此编译器无法执行此操作并为您提供错误。

答案 2 :(得分:2)

因为t1()不是constexpr函数,所以参数i是运行时变量......您无法将其传递给constexpr函数。 Constexpr期望在编译时知道参数。