使用常量变量作为数组的大小

3
以下代码片段为什么可以无错误编译通过:
void func(){
    const int s_max{ 10 };
    int m_array[s_max]{0}; 
}

int main() {
    const int s_max{ 10 };
    int m_array[s_max]{0}; 
    return 0;
}

但是当我尝试在类作用域内定义相同的数组时,会出现以下错误:

class MyClass
{
    const int s_max{ 10 }; 
    int m_array[s_max]{0}; // error: invalid use of non-static data member 's_max'
};

s_max为什么需要在类中声明为static

我在其他类似的帖子中没有找到令人信服的答案。


数组的长度必须是一个常量表达式,而const虽然必要但不足以构成常量表达式。 - Henri Menke
我有一些坏消息:尽管第一个代码片段“没有编译错误”,但它不是有效的C ++。你的编译器只是在帮你,允许一些不符合标准的C ++。 - Sam Varshavchik
1
@SamVarshavchik 我认为第一种情况应该没问题; s_max 是一个常量表达式. 具有整数或枚举类型,并引用已使用常量表达式初始化的完整非易失性const对象 - songyuanyao
1个回答

4

作为非静态数据成员,它可以通过不同的初始化方式(构造函数(成员初始化列表),默认成员初始化器,聚合初始化等)初始化不同的值。然后它的值在初始化之前是不确定的。但原始数组的大小必须在编译时固定并已知。例如:

class MyClass
{
    const int s_max{ 10 }; 
    int m_array[s_max]{0}; // error: invalid use of non-static data member 's_max'
    MyClass(...some arguments...) : s_max {20} {}
    MyClass(...some other arguments...) : s_max {30} {}
};

我明白了,所以当我们将其设为静态变量(并且还必须为其分配一个值),它将在编译时被确定,并且不会依赖于不同的初始化,对吗? - Monaj
1
@Monaj 是的,静态成员不能以不同的不确定方式进行初始化。 - songyuanyao

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