使用`constexpr`进行数组初始化

时间:2018-02-06 15:59:24

标签: c++ arrays c++11 constexpr

我知道在C ++ 11中,我可以写

class foo {
    static constexpr const char *one = "one";
}

但是,当我尝试为数组做同样的事情时

class bar {
    static constexpr const float prim[4] = {2, 3, 5, 7};
}

(稍后引用)我收到undefined reference链接器错误。

这对于数组是不可能的还是我在语法中遗漏了什么?

1 个答案:

答案 0 :(得分:1)

静态constexpr数据成员声明不是C ++ 11/14中的定义,因此您无法使用prim。 要解决此问题,请将以下语句放在cpp文件中的某个位置,就像处理任何其他非constexpr静态数据成员一样:

constexpr const float bar::prim[4];

换句话说,这会返回一个未定义的引用:

struct bar {
    static constexpr const float prim[4] = {2, 3, 5, 7};
};

int main() {
    auto *foo = bar::prim;
}

这不是:

struct bar {
    static constexpr const float prim[4] = {2, 3, 5, 7};
};

constexpr const float bar::prim[4];

int main() {
    auto *foo = bar::prim;
}

因为在第二种情况下,你实际上定义prim而不是声明它,因此你可以获得它的地址,通过引用使用它,等等......