'需要常量表达式'将正式参数保持为常量

时间:2016-09-30 12:49:31

标签: c++

这是一个C ++编程代码,用于显示array1和array2的值,但我得到一个编译时错误,因为' Constant Expression Required'。请帮忙

void display(const int const1 = 5)
{
    const int const2 = 5;
    int array1[const1];
    int array2[const2];

    for(int i = 1 ; i < 5 ; i++)
    {
        array1[i] = i;
        array2[i] = i * 10;

        std::cout << array1[i] << std::endl;
    }
}

void main()
{
    display(5);
}

1 个答案:

答案 0 :(得分:1)

在C ++中,const并不总是constexpr。在这些日子里,constexpr不存在,因此编译时间常数的唯一方法是使用const和文字,或使用enum,因为两者都是编译器很容易检查这些值。

但是,在C ++ 11中,我们添加了constexpr,它保证constexpr变量在编译时具有可用值,并声明可以评估constexpr函数如果所有参数都是constexpr,那么aat编译时间。

在您的代码中,您可以像这样编写变量const2

void display(const int const1=5)
{
    constexpr int const2 = 5;

    // ...
}

现在,您的代码对您正在做的事情更具表现力。你可以说“这个变量在编译时有一个已知值,这里是值”,而不是依赖于const在编译时可用。

但是,如果您尝试更改const1,则会收到错误消息。参数,即使默认值始终为运行时已知的值。如果该值仅在运行时已知,则不能在模板参数或数组大小中使用它。

如果您希望函数能够receive将值const1作为常量表达式从中接收它作为模板参数,因为模板参数在编译时始终是已知的。 / p>

template<int const1 = 5>
void display()
{
    constexpr int const2 = 5;

    int array1[const1];
    int array2[const2];
}

您必须像这样调用您的函数:

// const1 is 5
display();

// const1 is 10
display<10>();

如果您想了解有关模板的更多信息,请查看Function templates或此tutorial