为什么 C++ 数组的大小不能有一个返回常量的函数调用
why cant size of c++ arrays have a function call returning a constant
我无法合理化,因为为什么我们不能使用数组的大小作为返回常量的函数调用。编译时遇到以下错误。错误 E2313:函数 main() 中需要常量表达式
int getsize()
{
return 2;
}
void main()
{
const int x= getsize();
int arr[x];
}
您没有使用 constexpr
属性声明getsize()
。如果您确实使用 constexpr
,许多现代 C++ 编译器将能够做您想做的事情。
您有几个选项:
-
constexpr
最新的C++编译器 -
像
getsize<>::value
一样调用的基于模板类的函数几乎适用于所有C++编译器 -
编译时常量:
enum { size = ... }
- 可能适用于所有C++和许多 C 编译器 -
#define SIZE ...
或#define GETSIZE(args...) ...
- 最丑陋,但始终有效
该标准要求数组大小在编译时为可计算值,以便编译器可以确定它必须为堆栈上的程序分配的内存。 在您的情况下,即使您看起来已经声明了一个常量值,值const int x
也仅在运行时分配,因此无助于确定堆栈的内存。
这就是动态大小的数组始终在堆上分配内存的原因。
如前所述,一些较新的编译器(可能是 g++)将允许您实现您要求的内容,尽管如果您的目标是拥有跨编译器可移植的代码,这将不是一个好主意。
如果改为定义 x,则不会收到错误 E2313
#define arraySize 2
void main()
{
int arr[arraySize];
}
我希望你得到的点数组大小应该是constant
但在编译时它也应该是静态的。常量 int 返回函数无法在编译时生成静态常量值。如果您按照 Logicrat 的建议使用 constepxr
函数将在编译时返回一个静态常量值,它将由现代C++编译器编译。
相关文章:
- lower_bound()返回最后一个元素
- 有一个打印语句的函数是一种糟糕的编程实践吗
- VSCode-有一个红色下划线,但程序构建和运行正确,并且出现配音错误
- 如果有一个模板构造函数只有一个泛型参数,为什么我必须有一个复制构造函数
- 有没有可能有一个只有ADL才能找到的非好友功能
- C++ 这里有一个返回 (24) 的布尔返回类型函数
- 我有一个返回字符串向量的函数.它需要两个字符串,并且返回一个字符串中缺少的字符串
- 是否有一个C++函数可以准确返回平方根反比的内置 CPU 操作 RSQRTSS 的值?
- 编译器说这个函数必须返回一个值,但我已经有一个 return 语句
- 为什么静态指针返回函数中有一个"静态"键?
- 是否有一个特定的原因为什么落后的返回型不是班级的完整级别上下文
- 如果我有一个类,如何返回一个 jobject?
- 实际上什么返回类型有一个新的
- 为什么 C++ 数组的大小不能有一个返回常量的函数调用
- 当我有一个给出数组的函数时,如何返回一个字符串
- 我的返回语句有一个错误,我不知道要修复
- 在boost::test中是否有一个函数可以返回错误值
- 如果我在main中有一个while(1)循环,我需要一个返回值吗
- 我可以有一个返回*this并处理非常量对象的const成员函数吗
- C++中是否有一个标准函数,它接受一个参数并返回相同的参数