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?
_ "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
@ZDF Ho 'Aggiornamento 1' - può essere che questo causa MSVC 2015 per compilare quel codice (quando 'static_assert' è all'interno del corpo della classe). –
I compilatori sono dappertutto sul supporto 'constexpr' in questo momento; abbiamo incontrato bug di generazione del codice con loro in GCC e MSVC. – Crashworks