我在static constexpr
属性方面遇到了一些困难:它适用于具有enum class
成员的整数类型,但是当我尝试使用静态初始化的整数数组时,它在链接时失败{在undefined reference to S::a
内{1}}。
这是clang 3.9或g ++ 6.3和ld 2.27.90;以及main
的所有内容。
以下是重现此内容的最快摘录:
-std=c++14
感谢您对此情况的任何建议。
答案 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.
}