如何初始化一个长度等于一个const int方法返回值的数组?

3

我想要实现的目标是:

inline const int size() { return 256; }

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

    return 0;
}

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

表达式必须具有常量值

有没有不使用全局变量、宏、std::vector或在堆上创建arr[]的方法来实现我想要的功能?


1
C和C++是不同的语言。您介意选择其中一种吗? - MikeCAT
你试图实现的目标(如果我理解正确)和声明 const size = 256; 有什么区别? - DarthQuack
1
const -> constexpr - MikeCAT
1
我已经删除了C标签,因为MSVC不是C编译器。现在这是一个好问题。给你点赞。你的代码里缺少一个constexpr。但是std::vector<int> arr(size());更好一些。 - Bathsheba
1
@a.Li 这只是一个简单的例子,在我的实际代码中,我需要让 size() 在各种方法中可见,并且我不想为所有方法传递一个 const int size 变量作为参数。 - FuqMeOniChan
显示剩余6条评论
4个回答

7

移除 inlineconst,使用 constexpr 代替,来解决这个问题:

constexpr int size() { return 256; }

现在你可以像使用数组大小一样使用它:
int arr[size()];

在C++(而非C)中,数组的长度必须在编译时已知。 const 修饰符只表示一个值在程序运行期间不能更改。
通过使用 constexpr,您可以指定函数的输出是一个已知的常量,甚至在程序执行之前。

1
@FuqMeOniChan,欢迎您。请阅读其他答案以了解原因。同时,请查看https://stackoverflow.com/help/someone-answers并接受其中一个答案。 - newbie

2
看起来错误信息让你感到困惑。问题在于消息所说的不是 constant value , 而是 constant expression

定义可以在编译时评估的表达式。

这样的表达式可以用作非类型模板参数、数组大小和其他需要常量表达式的上下文中,例如。

为此,您可以添加 constexpr 修饰符:

constexpr 修饰符声明可以在编译时评估函数或变量的值。然后可以在只允许编译时常量表达式的情况下使用这些变量和函数(前提是给出了适当的函数参数)。

constexpr 添加到函数中,允许编译器将其评估为 constant expression

 constexpr const int size() { return 256; }

注意:将返回类型声明为值类型的 const 实际上并没有任何区别,因此您可以将其简单地删除。

非常感谢。我对constexpr不太熟悉。 - FuqMeOniChan

1

正如其他人指出的那样,您可以将const替换为constexpr,但我应该补充说明,您的原始代码在使用G++编译器时可以编译通过,因为它支持可变长度数组,而不像Microsoft的编译器。


1
没错,但这些是GCC的扩展,不是标准C ++。 - CoffeeTableEspresso

1

从C++20开始,您还可以将size作为立即函数,即保证在编译时进行评估的函数。

consteval int size() { return 256; }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接