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?
_ "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
@ZDF Ich habe "Update 1" - möglicherweise verursacht MSVC 2015 diesen Code zu kompilieren (wenn 'static_assert' im Klassenkörper ist). –
Compiler sind überall auf "conetexpr" Unterstützung gerade jetzt; In GCC und MSVC sind Fehler bei der Code-Generierung aufgetreten. – Crashworks