ref-qualifiziertes Mitglied fungiert als Vorlagenargument?

9

Dies kompiliert in clang 3.3:

%Vor%

scheitert aber in gcc 4.8.1:

%Vor%

Bei Verwendung in verschiedenen Kontexten führt dies zu allen Arten von unerwartetem Compiler-Verhalten wie Abstürzen oder internen Compiler-Fehlern.

Ich verstehe, dass ref-qualifizierte Memberfunktionen als "rvalue references for * this" bezeichnet werden ( N2439 ) im Standard und werden von gcc 4.8.1 unterstützt .

Das Problem besteht darin, sie als Vorlagenargumente zu verwenden, wobei gcc anscheinend nicht zwischen einem ref-qualifizierten und einem normalen Member-Funktionstyp unterscheidet.

Die Implementierung der std-Bibliothek durch clang scheint zu erkennen, ob diese Funktion von

unterstützt wird %Vor%

Also, ist dies die Verwendung von ref-qualifizierten Funktionen Standard oder eine Spracherweiterung?

    
iavr 11.09.2013, 16:11
quelle

1 Antwort

3

Nach 8.3.5 [dcl.fct] Absatz 6 (ich habe dem zitierten Text etwas hervorgehoben):

  

Der Rückgabetyp, die Parametertypliste, das ref-Qualifikationsmerkmal und das cv-Qualifikationsmerkmal seq, nicht jedoch die Standardargumente (8.3.6) oder die Ausnahmespezifikation (15.4 ), sind Teil des Funktionstyps .

Das heißt, der Ref-Qualifier ist sicherlich Teil des Typs. Außerdem können Sie gemäß 8.4.1 [dcl.fct.def.general] Absatz 5 Zeiger auf Elemente einschließlich der ref-Qualifikationsmerkmale erstellen:

  

Ein cv-qualifier-seq oder ein ref-qualifier (oder beide) kann Teil einer nicht statischen Memberfunktionsdeklaration sein, einer nicht statischen Memberfunktionsdefinition oder Zeiger nur auf Elementfunktion (8.3.5); siehe 9.3.2.

Es gibt keine spezielle Einschränkung, dass der Zeiger auf Elementfunktionen mit ref-qualifier nicht als nicht typisierte Vorlagenargumente verwendet werden kann. Das heißt, ich denke, dass die Teilspezialisierung, die Sie verwenden wollten, funktionieren sollte. Die Unterstützung von Ref-Qualifiers ist jedoch ein ziemlich neues Merkmal sowohl in clang als auch in gcc, d. H. Wahrscheinlich wurden nicht alle Corner-Fälle ausgebügelt. Ich probierte die oben abgeschnittenen mit ziemlich neuen Schnappschüssen sowohl von gcc (20130811) als auch von clang (trunk 190769) und beide kompilierten den Code OK. Natürlich macht dieser Ausschnitt nichts und ich habe nicht versucht, diese Funktion zu missbrauchen. Ich nehme an, Sie haben gerade ein paar Compiler-Bugs ausgelöst und ich bin mir sicher, dass beide Projekte Fehlerberichte gegen ihre neuesten Snapshots würden.

    
Dietmar Kühl 17.09.2013, 22:08
quelle