我想要实现的目标是:
inline const int size() { return 256; }
int main()
{
int arr[size()];
return 0;
}
但是在初始化arr[size()]时,Visual Studio会给出一个错误:
表达式必须具有常量值
有没有不使用全局变量、宏、std::vector或在堆上创建arr[]的方法来实现我想要的功能?
移除 inline
和 const
,使用 constexpr
代替,来解决这个问题:
constexpr int size() { return 256; }
int arr[size()];
const
修饰符只表示一个值在程序运行期间不能更改。constexpr
,您可以指定函数的输出是一个已知的常量,甚至在程序执行之前。 constant value , 而是 constant expression :
定义可以在编译时评估的表达式。
这样的表达式可以用作非类型模板参数、数组大小和其他需要常量表达式的上下文中,例如。
为此,您可以添加 constexpr
修饰符:
constexpr 修饰符声明可以在编译时评估函数或变量的值。然后可以在只允许编译时常量表达式的情况下使用这些变量和函数(前提是给出了适当的函数参数)。
将 constexpr
添加到函数中,允许编译器将其评估为 constant expression
。
constexpr const int size() { return 256; }
注意:将返回类型声明为值类型的 const
实际上并没有任何区别,因此您可以将其简单地删除。
正如其他人指出的那样,您可以将const
替换为constexpr
,但我应该补充说明,您的原始代码在使用G++编译器时可以编译通过,因为它支持可变长度数组,而不像Microsoft的编译器。
从C++20开始,您还可以将size
作为立即函数,即保证在编译时进行评估的函数。
consteval int size() { return 256; }
const size = 256;
有什么区别? - DarthQuackconst
->constexpr
? - MikeCATconstexpr
。但是std::vector<int> arr(size());
更好一些。 - Bathsheba