2017-02-19 127 views
3

我与static constexpr属性有一些困难:它与积分类型一起使用,有enum class成员,但是当我尝试使用静态初始化的整数数组完成时,它失败链接说undefined reference to S::a里面mainC++ 14静态constexpr成员数组链接失败

这是与铿3.9或g ++ 6.3和ld 2.27.90;和所有与-std=c++14

这里是重现此最快的片段:

struct S 
{ 
    static constexpr int a[5] = {0}; 
}; 


int main() 
{ 
    S s{}; 
    [[gnu::unused]] int b = s.a[0]; // force S stuff to be emitted 
    return 0; 
} 

谢谢您可能有这种情况的任何建议。

+0

你需要定义你的对象;在命名空间范围:'constexpr int S :: a [5];' – ildjarn

+0

@ildjarn谢谢!但是你知道为什么我必须为数组做这个而不是像纯整型类型的其他东西吗? – suut

回答

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. 
}