C2057构造函数初始化列表中的常量值定义出错

C2057 error on const value definie in constructor inialization list

本文关键字:常量 定义 出错 构造函数 初始化 列表 C2057      更新时间:2023-10-16

我有一个C2057错误(在Visual Studio 2010上),我不知道为什么。我知道,要在堆栈上初始化数组,必须在编译时知道大小,这就是为什么需要使用常量值(至少在Visual Studio上是这样,因为不允许像gcc中那样使用可变长度数组)。我的类中有一个const-value成员,我在初始化列表中定义了他的值。所以从技术上讲,这个值在编译时是已知的,对吧?我想知道为什么它不起作用?这里有一个片段:

class Dummy
{
    Dummy() : size(4096) {}
    void SomeFunction()
    {
        int array[size]; //return C2057 
        //...
    }
    const unsigned int size;
};

感谢

不幸的是,这个常量值不是编译时常量。您需要一个枚举、一个静态积分类型或一个C++11 constexpr

另一种选择是将Dummy作为类模板,采用非类型参数:

template <unsigned int SIZE>
class Dummy
{
    void SomeFunction()
    {
        int array[SIZE];
        //...
    }
};

size是常量,但在编译时不知道它是4096。

默认构造函数创建一个大小为4096的Dummy,但谁说Dummy类不是用不同的大小构造的呢?如果有另一个构造函数允许不同的大小,那么编译器不能假设size总是4096,所以它给出了编译时错误。

您可能不希望所有对象都具有相同值的const数据成员。如果你想在类中嵌套一个符号常量,你有两个选项:

class Dummy
{
    // ...
    static const unsigned int size = 4096;
    enum { another_size = 4096 };
};