2017-02-19 13 views
3

static constexprの属性ではいくつかの問題があります:enum classというメンバで整数型で動作しますが、静的に初期化された整数配列で処理しようとすると、 undefined reference to S::aの中にmainというリンクがあります。C++ 14静的constexprメンバ配列がリンク時に失敗する

これは、clang 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; 

それは整数型で動作します:それぞれ1について、あなたは定義を提供しなければなりません。具体的には、その変数のアドレスが取られるコンテキストが決してない(変数を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. 
} 
関連する問題