为什么这个变量需要是静态的?

Arm*_*fai 7 c++ arrays static member

class armon
{
    static const int maxSize=10;    

    int array[maxSize];

    int count=0;

    int* topOfStack=array;
}
Run Code Online (Sandbox Code Playgroud)

为什么maxSize需要static在数组中使用它?

qua*_*dev 14

它不具有是静态的,但它必须是一个常量表达式.

C++标准§8.3.4[dcl.array](强调我的):

如果存在constant-expression(5.19),则它应该是std :: size_t类型的转换常量表达式,并且其值应大于零


也就是说,以下内容也是有效的:

constexpr std::size_t Size()  { return 10; }; 

struct Y
{
    int array[Size()];
};
Run Code Online (Sandbox Code Playgroud)

注意:

由于编译器需要知道类的大小,所以不能这样做:

struct Y
{
    const int size = 10;
    int array[size];
};
Run Code Online (Sandbox Code Playgroud)

可能会制作Y不同大小的不同实例.

另外请注意,在这种情况下,int array[size]恒定的表达,因为它利用的this,见C++标准部§5.19 [expr.const]:

条件表达式e是核心常量表达式,除非根据抽象机器(1.9)的规则评估e将评估以下表达式之一:

- 这个(5.1.1),除了在constexpr函数或constexpr构造函数中被评估为e的一部分;

(评价size真的是this->size)


Abh*_*jit 5

这个问题有两个方面

方面1

C++数组具有固定大小,在编译期间需要知道其大小.如果在运行时期间需要延迟决策,则数组表达式将变得格式不正确.

方面2

将成员变量声明为非静态变量使其成为实例变量,其值仅在实例化对象时才存在,该变量在运行时完成.静态变量是一个类变量,其值可以在编译期间确定.

你的特殊例子成为经典的鸡蛋悖论.

class armon
{
    static const int maxSize=10;    

    int array[maxSize];

}
Run Code Online (Sandbox Code Playgroud)
  • 为了实例化您的类armon,您需要知道它的大小.
  • 为了了解它的大小,您需要知道各个成员的大小.在您的特定情况下,您需要知道数组的大小.
  • 为了知道数组的大小,您需要知道因变量maxSize的值.
  • 要访问因变量maxSize,您需要实例化该类 armon.
  • 为了实例化您的类armon,您需要知道它的大小.

因此,您的数组大小因变量应该是一个常量表达式,在您的特定情况下应该是一个静态变量,