2017-05-08 3 views
5

Es gibt eine klare und verständliche Liste von Kontexten, in denen eine Pack-Erweiterung unter cppreference.com auftreten kann. Was ich versuche, ist, die gleichen Informationen aus dem Standard abzuleiten, zum Teil, um Erfahrungen im Umgang mit dem Standard zu sammeln. Ich kann jedoch nicht alle auf cppreference.com aufgelisteten Pack-Erweiterungskontexte aus dem Standard ableiten.Kontexte, in denen Pack-Expansionen auftreten können

cppreference.com führt unter anderem die folgenden vier Kontexte auf: Funktionsargumentlisten, Vorlagenargumentlisten, Funktionsparameterlisten und Vorlagenparameterlisten.

Auf der anderen Seite, spricht der Standard (14.5.3.4): in einer Liste

Eine Packung Erweiterung besteht aus einem Muster und ein Auslassungszeichen, die Instanziierung von denen keine oder mehr Instanziierungen des Musters erzeugt (nachstehend beschrieben). Die Form des Musters hängt vom Kontext ab, in dem die Erweiterung stattfindet. Paketerweiterungen können in folgenden Kontexten auftreten:

  • In einem Funktionsparameterpaket (8.3.5); Das Muster ist die Parameterdeklaration ohne die Ellipse.
  • in einem Template Parameterpaket, das eine Packung Erweiterung (14.1) ist:
    • wenn die Template-Parameter ein Parameter Pack-Deklaration ist; das Muster ist die Parameterdeklaration ohne die Ellipse;
    • wenn das Vorlagenparameterpaket ein Typparameter mit einer Vorlagenparameterliste ist; Das Muster ist der entsprechende Typparameter ohne die Ellipse.
  • ...
  • In einer Template-Argument-Liste (14.3); Das Muster ist ein Template-Argument.
  • ...

ich nicht in der Lage bin, um herauszufinden, wo der Standard sagt, dass Erweiterungspaket in Funktionsargument Listen auftreten kann. Ich nehme an, dass dieser Kontext irgendwie durch einen der drei oben genannten Aufzählungspunkte abgedeckt ist.

Nur für den Fall ist es unklar, was ich mit Pack-Erweiterungen in Funktionsargument Listen bedeuten, sollten Sie das folgende Beispiel:

template <typename ...Args> void f(Args ...args) {} 
template <typename ...Args> void g(Args ...args) { 
    f(args...); // Pack expansion in a function argument list. 
} 
+0

Meinst du, wenn eine Funktion aufgerufen wird? Z.B. 'f (some_pack ...)' –

+0

@VittorioRomeo Genau, siehe auch die [cppreference.com-Seite] (http://en.cppreference.com/w/cpp/language/parameter_pack) in der Frage erwähnt. Ich spreche von den Beispielen unter der Überschrift "Funktionsargumentlisten". – user1494080

+0

mögliche vollständige Erklärung hier http://en.cppreference.com/w/cpp/language/parameter_pack siehe "Erweiterung Loci" –

Antwort

5

Eine Funktionsliste Argument ist syntaktisch Benutzer Initialisierer-Liste , so es wird von [temp.variadic]/(4.4) bedeckt:

In einer Initialisierer-Liste; Das Muster ist eine Initialisierungsklausel.


1. Die Grammatik eines Funktionsaufrufs ist Postfix-expression(Ausdrucksliste opt).Und eine Ausdruckliste ist nur eine Initialisierungsliste. ([expr.post])

Verwandte Themen