c++ - 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;
}
解决方案
const
并不意味着“编译时常量”或“常量表达式”。
它的意思是“不要让我改变这个运行时对象的值”。
有时,可以将const
对象视为常量“足够”满足您的需求,并且编译器在这些情况下将允许该代码。模板参数不是这些情况之一。
在main
中,改为使用constexpr
;它是为此目的添加到语言中的关键字。
但是,这对您没有帮助foo
,因为您根本无法做您想做的事情。相当于做foo
一个函数模板,length
作为模板参数。
推荐阅读
- php - 如何从 HTML 中的 curl 返回 XML?
- apache-nifi - 无法在 Mac 中完全删除 NiFi 状态(本地设置)
- mongodb - 我无法将文档插入到远程数据库服务器,出现错误 13(未经授权):“命令插入需要身份验证”
- mqtt - 如何获取以“mqtts://”开头的 mqtt 代理 url?
- amazon-web-services - 如何配置 AWS CodeBuild 构建规范以使用由 CloudFormation 创建的动态 ReportGroup
- nativescript - 使用 nativescript typescript 在 ios 中关闭 Modal 时显示 FancyAlert 时 UI 将被阻止
- python - Pandas 数据帧重采样方法“BA”和“A”之间的差异
- amazon-web-services - 使用 Prometheus 和 Grafana 可视化 EC2 元数据
- arrays - 如何将数组中对象的属性分配给多个类属性?
- c# - 错误:“Microsoft.WindowsAPICodePack.Shell.PropertySystem.PropertySystemException 无法获取此属性的可写属性存储。”