如何初始化长度等于 const int 方法的 return 的数组?

How can I initialize an array of its length equal to the return of a const int method?

我想要完成的是:

inline const int size() { return 256; }

int main()
{
    int arr[size()];

    return 0;
}

但是Visual Studio在初始化arr[size()]时给我一个错误:

expression must have a constant value

有没有一种方法可以在不使用全局变量、宏、std::vector 或在堆上创建 arr[ ] 的情况下完成我想要的?

删除 inlineconst 并添加 constexpr 说明符来解决问题:

constexpr int size() { return 256; }

现在您可以将其用作数组大小,例如:

int arr[size()];

在 C++(不是 C)中,数组的长度必须在编译时已知。 const 限定符仅表示值在程序的 运行 时间内不得更改。

通过使用 constexpr,您将指定函数的输出是一个已知常量,甚至在程序执行之前。

看起来错误消息让您感到困惑。问题是你不需要 constant value 正如消息所说,但 constant expression:

Defines an expression that can be evaluated at compile time.

Such expressions can be used as non-type template arguments, array sizes, and in other contexts that require constant expressions, e.g.

要实现这一点,您可以添加 constexpr 说明符:

The constexpr specifier declares that it is possible to evaluate the value of the function or variable at compile time. Such variables and functions can then be used where only compile time constant expressions are allowed (provided that appropriate function arguments are given).

到您的函数,允许编译器将其评估为 constant expression

 constexpr const int size() { return 256; }

注意:将 return 按值类型声明为 const 并没有真正的区别,因此您可以简单地删除它。

您可以像其他人指出的那样用 constexpr 替换 const,但我要补充一点,您的原始代码使用 G++ 编译器编译得很好,因为它支持可变长度数组,这与 Microsoft 的编译器不同.

从 C++20 开始,您还可以使 size 成为立即函数,即保证在编译时求值的函数。

consteval int size() { return 256; }