2015-04-26 7 views
6

Ho ridotto il mio problema al seguente:g ++ lamenta constexpr funzione non è un'espressione costante

struct A { 
    static constexpr std::size_t f() { return 4; } 
}; 

template<std::size_t N> 
struct B : A { 
    alignas(A::f()) char a[N]; 
}; 

non vedo cosa c'è di sbagliato in questo, ma se provo a compilare utilizzando g++:

main.cpp:9:19: error: expression 'A::f' is not a constant-expression 
    alignas(A::f()) char a[N]; 
       ^
main.cpp:9: confused by earlier errors, bailing out 

La riproduzione è disponibile on coliru.

+2

(http://comments.gmane.org/gmane.comp.gcc. bug/425219) GCC 5.1 mi dà un ICE, però. – chris

+6

[La trama si addensa ...] (http://coliru.stacked-crooked.com/a/3e4e9d42d7ee440a) – orlp

risposta

0

Non so perché il codice originale è male, ma qui è una soluzione alternativa: [? Questo, forse]

struct A { 
    static constexpr std::size_t f() { return 4; } 
}; 

template<std::size_t ALIGN, std::size_t N> 
struct C { 
    alignas(ALIGN) char a[N]; 
}; 

template<std::size_t N> 
struct B : A, C<A::f(), N> { 
};