Betrachten Sie Folgendes:
%Vor% Es baut und läuft erfolgreich in GCC 4.8, aber ist es streng legal?
T v = {}
ist ungültig für T=int&
, aber dieses Standardargument wird nicht verwendet.
Die einzig passende Sprache, die ich im Standard finden kann, scheint nicht explizit zu erklären, ob dieses Programm gültig ist oder nicht; Keines der Folgenden scheint wirklich relevant zu sein, obwohl das Thema auf verschiedene Arten berührt wird:
[C++11: 8.3.6/1]:
Wenn eine Initialisierungsklausel in einer Parameterdeklaration angegeben wird, wird diese Initialisierungsklausel als Standardargument verwendet. Standardargumente werden in Aufrufen verwendet, in denen nachstehende Argumente fehlen.
[C++11: 8.3.6/5]:
Ein Standardargument wird implizit in den Parametertyp konvertiert (Abschnitt 4). Das Standardargument hat die gleichen semantischen Einschränkungen wie der Initialisierer in einer Deklaration einer Variablen des Parametertyps unter Verwendung der Kopierinitialisierungssemantik (8.5). Die Namen im Standardargument werden gebunden, und die semantischen Integritätsbedingungen werden an dem Punkt überprüft, an dem das Standardargument erscheint. Namenssuche und Überprüfung von semantischen Integritätsbedingungen für Standardargumente in Funktionsschablonen und in Mitgliedsfunktionen von Klassenvorlagen werden wie in 14.7.1 beschrieben durchgeführt. [..]
[C++11: 8.3.6/9]:
Standardargumente werden bei jedem Aufruf der Funktion ausgewertet. [..]
Siehe 14.7.1 Implizite Instanziierung [temp.inst] / 13:
Wenn eine Funktionsvorlage f so aufgerufen wird, dass ein Standardwert benötigt wird Argument verwendet werden, werden die abhängigen Namen nachgeschlagen, die Semantik Constraints werden überprüft und die Instanziierung einer beliebigen Vorlage in Das Standardargument wird ausgeführt, als wäre das Standardargument ein Initialisierer in einer Funktion Vorlage Spezialisierung mit dem gleichen verwendet Umfang, die gleichen Template - Parameter und der gleiche Zugriff wie bei der Funktionsvorlage f verwendet an diesem Punkt, außer dass der Bereich, in dem Ein Verschlusstyp wird deklariert (5.1.2) - und damit verbunden Namespaces - bleiben aus dem Kontext der Definition bestimmt für das Standardargument. Diese Analyse wird als Standardargument bezeichnet Instanziierung. Das instanziierte Standardargument wird dann als verwendet Argument von f.
Das Beispiel darunter zeigt auch einen Fall, in dem das Standardargument nicht korrekt ist wenn instanziiert:
%Vor%Es gibt kein Ydef, also sind die Anrufe, die es verwenden, schlecht gebildet, aber die Anrufe, die es nicht verwenden, sind ok.
C ++ 11, 14.7.1 / 3:
... Es sei denn, ein Aufruf erfolgt zu einer expliziten Spezialisierung der Funktionsvorlage oder zu a Elementfunktion einer explizit spezialisierten Klassenvorlage, ein Standardargument für eine Funktionsvorlage oder a Die Memberfunktion einer Klassenvorlage wird implizit instanziiert, wenn die Funktion in einem Kontext aufgerufen wird erfordert den Wert des Standardarguments.
(Betonung meiner).
Kombiniere dies mit 14.7.1 / 1:
... Die implizite Instantiierung einer Klassenvorlagenspezialisierung verursacht das Implizite Instanziierung der Deklarationen, aber nicht der Definitionen oder Standardargumente der Klassenmemberfunktionen, ...
(Betonung wieder meine)
Ich würde sagen, dass aus dem obigen folgt, dass wenn nicht instanziiert wird, damit der Standardargumentwert nicht benötigt wird.
Tags und Links c++ c++11 language-lawyer