Meine Frage ist, ob der folgende Code gültig ist:static_assert in nicht initialisiert Template-Klasse mit gültiger Spezialisierung
template<int i> class Class
{
static_assert(sizeof(i) == 0, "Class instantiated with i != 1");
};
template<> class Class<1> {};
Dieser Code-Schnipsel kompiliert mit g++
. Aber clang++
wird durch die static_assert
gefangen:
error: static_assert failed "Class instantiated with non-int type"
Eine Vorlage, die einen Typ verwendet anstelle eines int
wie
template<typename T> class Class
{
static_assert(sizeof(T) == 0, "Class instantiated with non-int type");
};
template<> class Class<int> {};
wird von beiden Compiler akzeptiert. Für Funktionsvorlagen gilt genau das gleiche Muster.
Ich fand open-std.org::Non-dependent static_assert-declarations, aber das scheint nicht zu gelten, weil meine static_assert
ist abhängig von der Vorlage Parameter.
können Sie überprüfen das beschriebene Verhalten auf godbolt.org
EDIT: Wie Johan Lundberg im Kommentar weist darauf hin, meine Frage ist falsch. Tatsächlich hängt sizeof(i)
nicht von dem Vorlagenparameter ab. Auch R.Sahu hat völlig recht: Es wäre viel sinnvoller, i != 1
zu behaupten. Dafür akzeptieren beide Compiler den Code.
Allerdings kompiliert immer noch das obere Beispiel mit g++
. Als open-std.org::Non-dependent static_assert-declarations gilt für diesen Fall (ich entschuldige mich wieder für die falsche Frage in dieser Hinsicht): Ist g++
eigentlich falsch bei der Kompilierung des Codes ohne Fehler?
Ich glaube nicht, dass Sie richtig sind in "weil mein static_assert ist auf den Template-Parametern abhängig.". sizeof (i) hängt nicht vom * Wert * von i ab. –
Warum verwenden Sie sizeof im ersten Beispiel? i ist vom Typ int und sizeof (i) ist dasselbe wie sizeof (int). Vielleicht in der Behauptung, die Sie direkt verwenden möchten. – Fabio
Wollten Sie 'static_assert (i! = 1," Klasse instanziiert mit i! = 1 ") verwenden? –