2016-03-03 14 views
8

Lese cppreference.com:static_assert und Intel C++ Kompilierer

Eine statische assert Erklärung bei Block Umfang (als Block Deklaration) und innerhalb einer Klasse Körper (als Mitglied Anmeldung) erscheint

OK, jetzt habe ich den folgenden Code:

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 iher MSVC 2015 noch Intel C++ 16.0.2 kompilieren diesen Code (ersterer zeigt "Fehler C2131: Ausdruck wurde nicht zu konstant ausgewertet" und letzterer zeigt "Funktionsaufruf muss einen konstanten Wert in einem konstanten Ausdruck haben") und zeigt auf Aufruf von maxAlignment in static_assert).

Aber MSVC 2015 Update 1 hat den folgenden Code kompilieren, während Intel C++ Live 16.0.2 nicht:

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 

(So kann MSVC static_assert behandeln, wenn es sich in einer Klasse Vorlage ist Körper)

Aber der folgende Code wird erfolgreich von beiden der Kompilierer kompiliert (static_assert außerhalb einer Klasse Körper, es bei einem Block Umfang erscheint):

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"); 

Meine Frage ist: Habe ich etwas verpasst oder ist, dass Intel C++ Fehler des Compilers?

+0

_ "MSVC 2015 kompiliert den Code von oben erfolgreich." _ Nicht auf meinem Computer: _ "Fehler C2131: Ausdruck wurde nicht zu einer Konstante ausgewertet" _ Ich habe das gleiche Ergebnis bei Intel & GCC erhalten. – ZDF

+0

@ZDF Ich habe "Update 1" - möglicherweise verursacht MSVC 2015 diesen Code zu kompilieren (wenn 'static_assert' im Klassenkörper ist). –

+1

Compiler sind überall auf "conetexpr" Unterstützung gerade jetzt; In GCC und MSVC sind Fehler bei der Code-Generierung aufgetreten. – Crashworks

Antwort

1

Wenn ich mich recht erinnere consxpr Funktionen können nicht verwendet werden, bis sie vollständig definiert sind und Klassen-constexpr Funktionen sind undefiniert, bis die Klasse definiert ist und es bedeutet, dass Sie nicht constexpr Mitgliedsfunktion innerhalb der Klasse verwenden können -scope static_assert, die genau diese Funktion definiert.

Aber Sie können diese Funktion Standalone machen (es ist sowieso schon statisch) und es wird die Arbeit machen. Es sollte überall kompilieren.

+0

Die Funktion ist 'static', ja, aber es hängt von den Argumenten der Vorlage ab. –

+0

@ RuslanGaripov, Standalone-Funktionen möglicherweise Vorlage Argumente sowie – ixSci

+0

OK, vielen Dank! –