C++ C++;类内静态常量数组初始化

C++ C++;类内静态常量数组初始化,c++,c++11,C++,C++11,我想创建一个常量和静态整数数组作为公共类变量。 定义它并立即初始化它是很简单的。请参阅下面的代码以了解完整示例 #include <iostream> class Foo { public: constexpr static int arr[3][2] = { {1, 2}, {3, 4}, {5, 6} }; }; int main() { for (int i = 0; i <

我想创建一个常量和静态整数数组作为公共类变量。 定义它并立即初始化它是很简单的。请参阅下面的代码以了解完整示例

#include <iostream>

class Foo {
public:
    constexpr static int arr[3][2] = {
            {1, 2},
            {3, 4},
            {5, 6}
    };
};

int main() {
    for (int i = 0; i < 3; i++) {
        std::cout << "Pair " << Foo::arr[i][0] << ", " << Foo::arr[i][1] << std::endl;
    }
    return 0;
}

这不是C++中的可能吗?更可能的是,我忽略了C++的部分内容及其静态变量初始化策略。

< P>编译器错误是由于<代码> C++ 11 标准> < /P> 使用
C++17
标准,通过使用

g++ --std=c++17 test.cpp
不会产生错误

编辑:这个解决方案适用于
C++17
,而不是像我原来的问题那样适用于
C++11
。有关
C++11
解决方案,请参阅已接受的答案。

在C++17之前(因此C++11和C++14)必须添加

constexpr int Foo::arr[3][2];

在类的主体之外。

clang运行它gcc不存在有一个向上投票和concider添加[language Layer]后续gcc使用
-std=c++17运行它
gcc使用-std=c++17接受它。IIRC,此类静态类数据成员的内联定义随C++14或C++17一起提供。其他编译器可能在早些时候将其合并为一个扩展。尽管我对你的问题发表了评论,但C++11标准似乎确实支持这一点。这表明
constexpr static int-arr[]={1,2,3}(在
结构中
)自C++11起“正常”。@AdrianMole自C++11起“正常”,但根据max66的回答,还需要一个类外定义。在C++11之前
constepr
不是一个关键字问题被标记为C++11,因此此解决方案不是applicable@AdrianMole真的。。。但这也许是OP编辑问题的合适地点,以澄清他们对使用更高版本的语言持开放态度。这也是一个解决方案。然而,这不是一个非常简洁的方法。@Talos在C++17之前,这是静态成员变量的标准方法。对于C++11,您有更好的想法吗?@M.M在一次初始化中初始化类体内的常量静态数组line@Talos在C++之前,还需要类外定义。17@Talos,类内定义仅适用于C++11中的整数值。Gcc就在这里拒绝了C++11的代码。没有在家里用“真实”的叮当声检查,但我猜在GodBolt上,一些链接简化可能会持续,迫使数组在那里有内部链接。
constexpr int Foo::arr[3][2];