const参数不够const

时间:2018-09-04 11:26:13

标签: c++ arrays parameters const

此代码

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

1 个答案:

答案 0 :(得分:11)

const并不表示“编译时常量”或“常量表达式”。

这意味着“不要让我更改此运行时对象的值”。

有时一个const对象可以满足您的需要,“常量”足够了,在这种情况下,编译器将允许使用该代码。模板参数不是其中一种情况。

main中,use constexpr instead;为此,已在语言中添加了一个关键字。

尽管如此,foo并不能为您提供任何帮助,因为您根本无法做您想做的事情。等效的方法是将foo用作功能模板,并将length作为模板参数。