首页 > 解决方案 > const 参数不够 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

为什么不能将本地的 const 长度std::array作为函数参数传递?

为什么它在 main 方法中起作用?

我知道,像这样的模板方法会起作用

template <size_t length>
void foo() {
    std::array<int, length> arr;
}

标签: c++arraysparametersconstants

解决方案


const并不意味着“编译时常量”或“常量表达式”。

它的意思是“不要让我改变这个运行时对象的值”。

有时,可以将const对象视为常量“足够”满足您的需求,并且编译器在这些情况下将允许该代码。模板参数不是这些情况之一。

main中,改为使用constexpr;它是为此目的添加到语言中的关键字。

但是,这对您没有帮助foo,因为您根本无法做您想做的事情。相当于做foo一个函数模板,length作为模板参数。


推荐阅读