Bedenken Sie Folgendes:
%Vor%Abgesehen von offensichtlich fehlenden Headern, sollte das kompiliert werden?
Mit anderen Worten frage ich, ob der statische Assertionsfehler, der innerhalb eines nachfolgenden declltyps auslöst, während er den Rückgabewert einer überladenen Funktionsschablone ableitet, angefordert wird, die Kompilierung anzuhalten, oder ob die Überladung einfach verworfen werden muss.
>In gcc 4.7 schlägt die Kompilierung fehl. Ich bin jedoch ziemlich positiv, dass dies ok in gcc 4.8 kompiliert wird (aber in diesem Moment nicht überprüfen kann). Wer hat Recht?
Die Kompilierung muss in jedem kompatiblen Compiler fehlschlagen.
SFINAE-Regeln basieren auf Deklarationen und nicht auf Definitionen. (Entschuldigung, wenn ich hier die falsche Terminologie verwende.) Was ich meine, ist Folgendes:
Für eine Klasse / Struktur:
%Vor%Für eine Funktion:
%Vor%Außerdem unterliegt das Nicht-Vorhandensein der struct / function für die gegebene Menge von Template-Argumenten ebenfalls den SFINAE-Regeln.
Jetzt kann static_assert
nur in den Regionen angezeigt werden, in denen Fehler bei der Ersetzung auftreten. Wenn sie ausgelöst werden, erhalten Sie daher einen Compilerfehler.
Zum Beispiel wäre das folgende eine falsche Implementierung von enable_if
:
Versuchen Sie es dann
%Vor% Wenn Sie die Spezialisierung von enable_if
für false
entfernen, wird der Code kompiliert und ausgegeben
In gcc 4.7 schlägt die Kompilierung fehl. Ich bin jedoch ziemlich positiv, dass dies ok in gcc 4.8 kompiliert wird (aber in diesem Moment nicht überprüfen kann). Wer hat Recht?
Die Bedingung in Ihrer statischen Assertion hängt nicht von einem Vorlagenparameter ab. Daher kann der Compiler beim Analysieren der Vorlage sofort false
auswerten und erkennen, dass die Assertion ausgelöst werden sollte - unabhängig davon, ob Sie die Vorlage irgendwo anders instanziieren.
Das Gleiche sollte bei jedem Compiler zutreffen.
Tags und Links c++ c++11 sfinae static-assert