Lesen cppreference.com :
Eine statische assert-Deklaration kann im Blockbereich (als Block) erscheinen Deklaration) und innerhalb eines Klassenkörpers (als Mitgliedserklärung)
OK, jetzt habe ich den folgenden Code:
%Vor% Weder MSVC 2015 noch Intel C ++ 16.0.2 kompilieren diesen Code (ersterer zeigt "Fehler C2131: Ausdruck wurde nicht als konstant ausgewertet" und Letzterer zeigt "Fehler beim Aufruf eines Funktionsaufrufs muss in einem konstanten Ausdruck konstant sein") Aufruf von maxAlignment
in static_assert
).
Aber MSVC 2015 Update 1 kompiliert den folgenden Code, während Intel C ++ 16.0.2 nicht :
%Vor% (MSVC kann daher static_assert
verarbeiten, wenn es sich in einem template Klassenkörper befindet)
Aber der folgende Code wird von beiden Compilern erfolgreich kompiliert ( static_assert
befindet sich außerhalb eines Klassenkörpers; er erscheint in einem Blockbereich):
Meine Frage ist : Habe ich etwas übersehen oder ist der Fehler des Intel C ++ Compilers?
Wenn ich mich recht erinnere, können die conetexpr-Funktionen erst verwendet werden, wenn sie vollständig definiert sind und die Klassen-constexpr-Funktionen undefiniert sind, bis die Klasse definiert ist und die constexpr-Elementfunktion innerhalb der Klasse nicht mehr verwendet werden kann. scope static_assert
, das genau diese Funktion definiert.
Aber Sie können diese Funktion eigenständig machen (es ist sowieso schon statisch) und es wird den Job machen. Es sollte überall kompilieren.
Tags und Links c++ visual-c++ icc static-assert