为什么 C++ 数组的大小不能有一个返回常量的函数调用

why cant size of c++ arrays have a function call returning a constant

本文关键字:返回 有一个 常量 函数调用 不能 C++ 数组 为什么      更新时间:2023-10-16

我无法合理化,因为为什么我们不能使用数组的大小作为返回常量的函数调用。编译时遇到以下错误。错误 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++编译器编译。