Statische Behauptungen und SFINAE

9

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?

    
bluescarni 30.04.2013, 14:58
quelle

2 Antworten

12

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 :

%Vor%

Versuchen Sie es dann

%Vor%

Wenn Sie die Spezialisierung von enable_if für false entfernen, wird der Code kompiliert und ausgegeben

%Vor%     
Cassio Neri 30.04.2013, 16:31
quelle
6
  

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.

    
Andy Prowl 30.04.2013 15:03
quelle

Tags und Links