Beim Durchsuchen der aktuellen Implementierung neuer C ++ 11-Header durch gcc bin ich auf das Token "......" gestoßen. Sie können überprüfen, ob der folgende Code gut kompiliert werden kann [via ideone.com].
template <typename T>
struct X
{ /* ... */ };
template <typename T, typename ... U>
struct X<T(U......)> // this line is the important one
{ /* ... */ };
Was bedeutet dieses Token?
edit: Sieht so aus, als hätte "......" im Fragentitel auf "..." gekürzt, ich meinte wirklich "......". :) :)
c++
c++11
variadic-templates
Vitus
quelle
quelle
...
folgt...
.U...
gefolgt von...
. Trotzdem sehr seltsam.<functional>
und<type_traits>
immer im Kontext einer Funktionsargumentliste innerhalb eines Vorlagenparameters gefunden werden.Antworten:
Jede Instanz dieser Kuriosität ist mit einem Fall einer regulären einzelnen Ellipse gepaart.
Ich vermute, dass die doppelte Ellipse eine ähnliche Bedeutung hat wie
_ArgTypes..., ...
eine variable Vorlagenerweiterung, gefolgt von einer Varargs-Liste im C-Stil.Hier ist ein Test , der diese Theorie unterstützt… Ich denke, wir haben einen neuen Gewinner für den schlechtesten Pseudooperator aller Zeiten.
Bearbeiten: Dies scheint konform zu sein. §8.3.5 / 3 beschreibt eine Möglichkeit, die Parameterliste zu bilden als
Die Doppelellipse wird also durch eine Parameterdeklarationsliste gebildet, die mit einem Parameterpaket endet, gefolgt von einer weiteren Ellipse.
Das Komma ist rein optional; §8.3.5 / 4 sagt
Dies ist innerhalb eines abstrakten Deklarators, [Bearbeiten], aber Johannes macht einen guten Punkt, dass sie sich auf einen abstrakten Deklarator innerhalb einer Parameterdeklaration beziehen. Ich frage mich, warum sie nicht "Teil einer Parameterdeklaration" gesagt haben und warum dieser Satz nicht nur eine informative Notiz ist ...
Weiterhin
va_begin()
in<cstdarg>
erfordert einen Parameter , bevor die Liste varargs, so dass der Prototypf(...)
speziell von C ++ erlaubt ist nutzlos. Querverweise mit C99 sind in der Ebene C illegal. Das ist also höchst bizarr.Verwendungshinweis
Auf Anfrage finden Sie hier eine Demonstration der doppelten Ellipse:
quelle
std::is_function
'svalue
muss wahr sein, auch wenn die Funktion C varargs eins ist und weil T (U ...) für eine solche Funktion nicht übereinstimmt, brauchen Sie diesen Wahnsinn. ZB stimmt int f (int, char, ...) genau mit T (U ......) mit T = int, U = {int, char} und dem varargs-Token "..." überein.void (int...)
ist das...
hier nicht Teil des Abstract-Deklaratorsint
, daher ist es auch ein Synonym fürvoid(int, ...)
. Wenn Sie schreiben würdenvoid(T...)
undT
ein Template-Parameterpaket sind,...
wäre dies Teil des Abstract-Deklarators und daher nicht gleichbedeutend mitvoid(T, ...)
.f(...)
wird häufig als Überlastung von Fallback-Funktionen bei der Metaprogrammierung von Vorlagen verwendet, wenn diese Informationen nicht erforderlich sind (und wenn die Funktion nicht einmal aufgerufen wird).In vs2015 ist das Trennen von Kommas in der Vorlagenversion unerlässlich:
Eine beispielhafte Instanziierung ist:
Grüße, FM.
quelle