2016-03-03 13 views
8

lettura cppreference.com:static_assert e Intel C++ compilatore

Una dichiarazione asserzione statico potrebbe apparire a perimetro del blocco (come un blocco dichiarazione) e all'interno di un corpo classe (come dichiarazione membro)

OK, ora ho il seguente codice:

struct foo_t 
{ 
    static constexpr std::size_t maxAlignment() 
    { 
     // This is just a sample; I removed real code from this method. 
     return std::max(alignof(__m128), __alignof(__m256)); 
    } 

    static_assert(0 == ((maxAlignment() -1) & maxAlignment()), "some message"); 
}; 

Ne né MSVC 2015 né Intel C++ 16.0.2 compilano questo codice (il primo mostra "errore C2131: espressione non valutata come costante" e quest'ultimo mostra "la chiamata di funzione deve avere un valore costante in un'espressione costante" errore e punti di chiamata di maxAlignment in static_assert).

Ma MSVC 2015 Update 1 non compilare il seguente codice, mentre Intel C++ 16.0.2 non lo fa:

template <typename T, std::size_t Alignment> 
struct foo_t 
{ 
    static constexpr std::size_t maxAlignment() 
    { 
     return std::max(std::alignment_of<T>::value, Alignment); 
    } 

    static_assert(0 == ((maxAlignment() -1) & maxAlignment()), "some message"); 
}; 

foo_t<__m128, 16> foo {}; 
// foo_t<__m128, 33> boo {}; // here `static_assert` will stop compilation 

(Quindi, MSVC in grado di gestire static_assert quando è all'interno di un template classe corpo)

Tuttavia, il seguente codice viene compilato correttamente da entrambi i compilatori (static_assert non è compreso nel corpo di una classe e viene visualizzato in un ambito di blocco):

struct foo_t 
{ 
    static constexpr std::size_t maxAlignment() 
    { 
     return std::max(alignof(__m128), __alignof(__m256)); 
    } 
}; 

static_assert(0 == ((foo_t::maxAlignment() -1) & foo_t::maxAlignment()), "some message"); 

La mia domanda è: Mi sono perso qualcosa o è che Intel C++ errore del compilatore?

+0

_ "MSVC 2015 compila correttamente il codice dall'alto." _ Non sul mio computer: _ "errore C2131: espressione non valutata su una costante" _ Ho ottenuto lo stesso risultato su Intel e GCC. – ZDF

+0

@ZDF Ho 'Aggiornamento 1' - può essere che questo causa MSVC 2015 per compilare quel codice (quando 'static_assert' è all'interno del corpo della classe). –

+1

I compilatori sono dappertutto sul supporto 'constexpr' in questo momento; abbiamo incontrato bug di generazione del codice con loro in GCC e MSVC. – Crashworks

risposta

1

Se lo ricordo correttamente, le funzioni di constexpr non possono essere utilizzate finché non sono completamente definite e le funzioni di constexpr di membro di classe non sono definite fino a quando la classe non è definita e significa che non è possibile utilizzare la funzione membro di constexpr all'interno della classe -scope static_assert che definisce questa stessa funzione.

Ma è possibile rendere questa funzione autonoma (è già statica in ogni caso) e farà il lavoro. Dovrebbe essere compilato ovunque.

+0

La funzione è 'statica', sì, ma dipende dagli argomenti del modello. –

+0

@RuslanGaripov, le funzioni standalone potrebbero avere argomenti modello pure – ixSci

+0

OK, grazie mille! –

Problemi correlati