C ++ 14静态constexpr成员数组在链接时失败

时间:2017-02-19 16:23:52

标签: c++ linker c++14 constexpr

我在static constexpr属性方面遇到了一些困难:它适用于具有enum class成员的整数类型,但是当我尝试使用静态初始化的整数数组时,它在链接时失败{在undefined reference to S::a内{1}}。

这是clang 3.9或g ++ 6.3和ld 2.27.90;以及main的所有内容。

以下是重现此内容的最快摘录:

-std=c++14

感谢您对此情况的任何建议。

1 个答案:

答案 0 :(得分:5)

考虑以下代码:

enum class E { foo, bar };
struct S
{
  static constexpr int a[5] = {0};
  static constexpr int b = 42;
  static constexpr E e = foo;
};

以上所有都是声明,并且不是定义。对于每一个,您必须提供定义

int S::a[5];
int S::b;
E S::e;
  

它适用于整数类型,使用枚举类成员

这或多或少偶然。具体来说,它的工作原理是因为你从来没有一个上下文来获取该变量的地址(从不ODR使用变量)。

我常常看到人们向std::max添加一个看似无辜的电话,突然发现他们没有提供定义。那就是:

int main()
{
   printf("%d\n", S::b);       // works fine
   int x = std::max(1, S::b);  // fails to link in non-optimized build.
}