c++ - 使用类定义中的推断维度初始化静态常量多维数组

标签 c++ visual-c++ c++11 visual-studio-2013

从 C++11 开始,可以在类定义中初始化 static const 内置类型,如下所示:

class A {
public:
    static const unsigned int val = 0; //allowed
};

但是,在 Visual C++ 2013 中使用数组执行此操作会给我一个错误,告诉我这是不允许的:

class B { 
public:
    static const unsigned int val[][2] = { { 0, 1 } }; //not allowed
};

错误消息只是“const unsigned int [][2] 类型的成员不能有类内初始化程序。”相反,我被迫执行以下操作:

class C {
public:
    static const unsigned int val[][2];
};

const unsigned int C::val[][2] = { { 0, 1 } };

这很不幸,因为我的代码依赖于 val 的大小,并且我希望能够更改 val 的内容,而不必记得返回并在某处更改常量。是否有一种不同的方法可以让我在声明下方的文件中的任何位置对 val 使用 sizeof

最佳答案

您的数组必须是 constexpr(clang 和 gcc 在它们的错误消息中指定它):

class B { 
public:
    static constexpr const unsigned int val[][2] = { { 0, 1 } };
    //     ^^^^^^^^
};

看到它工作 here .

Visual Studio CTP 2013 (一个“beta”版本,在生产中应该避免)提供对 constepxr 的支持,它也应该在未来的版本中可用。

编辑:

如果您的编译器不支持 constexpr(希望对您而言,不会太久),那么您就不能对静态数组进行类内初始化,而必须使用旧方法:

class C {
public:
    static const unsigned int val[][2];
};

const unsigned int C::val[][2] = { { 0, 1 } };

如果您的数组类型是完整的(如果您声明了所有数组维度),则可以应用 sizeof(编译器知道期望有多少个元素): ;

class C {
public:
    static const unsigned int val[2][2];    // Specify all dimensions.
    void foo() { cout << sizeof(C::val); }  // OK
};

const unsigned int C::val[][2] = { { 0, 1 } , { 2, 3 } };

int main() {
    C c;
    c.foo();
    return 0;
}

关于c++ - 使用类定义中的推断维度初始化静态常量多维数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24665959/

相关文章:

c++ - 多线程和多进程的性能差异

c++ - Printf 没有打印任何要输出的内容? C++ SDL

c - 设置为空环境变量的其他包含目录会中断 Visual C++ 构建

c++ - std::vector 混合数据类型

C++ 11 : Start thread with member function and this as parameter

c++ - 如何清理失败的构造函数

c++ - 如何调用 char 构造函数而不是 char[] 构造函数

c++ - 是否有可以在 Visual Studio 6 C++ 上运行的反编译器

c++ - AfxLoadLibrary 与 LoadLibrary

multithreading - C++ 0x中线程之间的异常传播