'Constant Expression Required' 错误,同时将正式参数保留为常量
'Constant Expression Required' Error while keeping formal argument as a constant
这是一个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
,你会得到一个错误。参数,即使默认值始终作为运行时已知的值。如果该值仅在运行时已知,则不能在模板参数或数组大小中使用它。
如果你希望你的函数能够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>();
如果你想了解更多关于模板的知识,请查看函数模板,或者本教程
相关文章:
- 如何创建长度由常量参数指定的数组
- 通过常量引用传递参数的矩阵模板类
- 具有常量引用参数的函数模板专用化
- 使用自动推导的 lambda 参数作为常量表达式
- C++:常量引用参数
- 常量参数"real"常量吗?
- 常量参数存储在哪里 (C++)?
- 常量函数,当其参数是对文字类型的引用时
- 区分接受常量参数的函数引用/指针和与函数参数同名的非常量参数
- 必须非常量别名参数及其默认参数常量
- 字符串参数常量字符* 和常量 wchar_t*
- 可选参数常量引用重新分配
- 推导模板化类参数的模板参数:常量问题
- 从函数参数常量字符串 (&) 设置值
- 为什么我必须声明这些引用参数常量或按值传递
- C++使用一个参数常量重载
- 如果要执行const_cast,为什么要制作参数常量?
- 模板非类型参数常量限制筛选器库
- 标记方法指针/引用参数常量真的会显著影响性能吗
- 当函数参数常量引用 T 时,为什么 T 的模板参数推导'skips'数组元素的恒定性?