此代码
#include <array>
void foo(const int length) {
std::array<int, length> arr; //line 4
}
int main(){
const int length = 10;
std::array<int,length> arr;
}
出现错误消息
:在函数'void foo(size_t)'中:
:4:27:错误:“长度”不是常量表达式
std::array<int, length> arr;
https://gcc.godbolt.org/z/MMQXHx
参数length
被标记为const
。
为什么不能将本地std::array
的const长度作为函数参数传递?
为什么它在main方法中起作用?
我知道,这样的模板方法会起作用
template <size_t length>
void foo() {
std::array<int, length> arr;
}
答案 0 :(得分:11)
const
并不表示“编译时常量”或“常量表达式”。
这意味着“不要让我更改此运行时对象的值”。
有时一个const
对象可以满足您的需要,“常量”足够了,在这种情况下,编译器将允许使用该代码。模板参数不是其中一种情况。
在main
中,use constexpr
instead;为此,已在语言中添加了一个关键字。
尽管如此,foo
并不能为您提供任何帮助,因为您根本无法做您想做的事情。等效的方法是将foo
用作功能模板,并将length
作为模板参数。