保持形式参数为常数时出现“需要常量表达式”错误

阿比纳夫·库沙格拉(Abhinav kushagra)

这是一个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);
}
纪尧姆·拉西科特(Guillaume Racicot)

在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,则会出现错误。参数,即使具有默认值,也始终是运行时已知的值。如果仅在运行时知道该值,则不能在模板参数或数组大小中使用它。

如果您希望函数能够receive将值const1作为一个常量表达式,从那里可以将其作为模板参数接收,因为模板参数总是在编译时就知道的。

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

如果您想了解更多有关模板的信息,请查看“功能模板”或本教程。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Maven Android插件错误“需要常量表达式”

编译错误:需要常量表达式

VBA - 错误“常量表达式需要”

需要澄清常量表达式

Android“需要常量表达式”

需要常量表达式

飞镖:常数评估错误。方法“ []”不能在常量表达式中调用

“预期常量表达式”错误

dart常量创建的参数必须是常量表达式

传递const变量时,编译器返回错误:template参数不是常量表达式

Sub With Arguments 产生错误(编译错误:需要常量表达式)

Java枚举:重构switch语句“需要常量表达式”会编译错误?

onRequestPermissionResult的转换大小写需要常量表达式错误

函数声明行上的“需要常量表达式”错误

GLSL:由于非常量表达式初始化,For循环中出现错误

得到错误:“变量不能出现在常量表达式中”

枚举属性中的变量:需要常量表达式

Dart Built_Value,序列化器中的BuiltList错误-常量创建的参数必须为常量表达式

此错误消息正确吗:非类型模板参数不是常量表达式

整体模板参数。错误:在常量表达式中使用“ this”

错误:非常量表达式无法从类型'npy_intp'缩小为'int'

通用lambda及其作为常量表达式的参数

为什么参数不是常量表达式?

切换case语句错误:case表达式必须为常量表达式

致命错误C1017:使用“ #if(false)”时无效的整数常量表达式

错误:不是常量表达式。(扑)

MS Visual Studio 错误:预期的常量表达式

静态断言C ++-常量表达式错误

为什么折叠表达式不能出现在常量表达式中?