C ++ 17 führt Vorlagenargumentabzug ein.
Mit gcc-7.2 kann ich es einfach in einer Funktion verwenden:
%Vor%Ich habe erwartet, dass dieselbe Syntax in nicht statischen Datenmembern der Klasse funktioniert, wie zum Beispiel:
%Vor% aber dies verursacht gcc error: invalid use of template-name ... without an argument list
, mit --std=c++17
übergeben.
Ich habe ein paar andere Kombinationen ausprobiert, aber keine scheint zu funktionieren.
Ist dies das beabsichtigte Verhalten des Standards oder handelt es sich hierbei um eine unvollständige Unterstützung durch den Compiler? Ich kann keinen expliziten Verweis auf Klassendatenelemente im Standard finden.
Mein Anwendungsfall ist natürlich viel komplexer, da diese Syntax sehr praktisch wäre (denke, dass Funktionen weitergegeben und gespeichert werden).
Ist dies das beabsichtigte Verhalten des Standards oder handelt es sich hierbei um eine unvollständige Unterstützung durch den Compiler?
Ja, das ist ein beabsichtigtes Verhalten. [dcl.type.class.deduct] lautet:
Wenn ein Platzhalter für einen abgeleiteten Klassentyp als decl-specifier in decl-specifier-seq einer Initialisierungsdeklaration ([dcl.init]) von erscheint eine Variable , [...]
Ein Platzhalter für einen abgeleiteten Klassentyp kann auch in type-specifier-seq in der new-type-ID oder type-id
eines neuen Ausdrucks oder als einfacher Typ-Spezifizierer in einer expliziten Typumwandlung (funktionale Notation). Ein Platzhalter für einen abgeleiteten Klassentyp darf in keinem anderen Kontext erscheinen .
Ein nicht statisches Datenelement ist keine Variable und wir befinden uns in keiner der anderen Situationen.
Beachten Sie, dass das gleiche Prinzip für nicht statische Datenelemente gilt, die mit auto
deklariert werden sollen:
Der Standardmemberinitialisierer ist genau das - ein Standardinitialisierer. Was, wenn Sie einen Konstruktor zur Verfügung gestellt haben, der das Mitglied mit verschiedenen Typen von Ausdrücken initialisiert hat?