'Constant Expression Required' 错误,同时将正式参数保留为常量

'Constant Expression Required' Error while keeping formal argument as a constant

本文关键字:参数 常量 保留 Expression Constant Required 错误      更新时间:2023-10-16

这是一个c++编程代码显示array1和array2的值,但我得到一个编译时错误为'常数表达式要求'。请帮助

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

在c++中,const并不总是constexpr。在过去,constexpr不存在,所以拥有编译时间常数的唯一方法是使用const和文字,或者使用enum,因为这两种方法都很容易让编译器检查值。

然而,在c++ 11中,我们增加了constexpr,它保证constexpr变量在编译时有一个可用的值,并且声明如果所有参数都是constexpr, constexpr函数可以在编译时求值。

在您的代码中,您可以这样编写变量const2:
void display(const int const1=5)
{
    constexpr int const2 = 5;
    // ...
}

现在你的代码更能表达你正在做的事情。而不是依赖const在编译时可用,你说"这个变量在编译时有一个已知的值,这就是它的值"。

然而,如果你试图改变const1,你会得到一个错误。参数,即使默认值始终作为运行时已知的值。如果该值仅在运行时已知,则不能在模板参数或数组大小中使用它。

如果你希望你的函数能够receiveconst1作为一个常量表达式,你可以从那里接收它作为模板参数,因为模板参数在编译时总是已知的。

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>();

如果你想了解更多关于模板的知识,请查看函数模板,或者本教程