In C ++ 20 kann der auto
Funktionsparametertyp verwendet werden.
Ermöglicht es auch die Verwendung auto
eines Platzhalters als Vorlagenargument (nicht ähnlich, aber in gewisser Weise im Sinne der C ++ 17-Vorlage <auto> ) für den Funktionsparametertyp?
Also der folgende Code vor C ++ 20:
template<typename First, typename Second>
void printPair(const std::pair<First, Second>& p) {
std::cout << p.first << ", " << p.second;
}
Könnte geschrieben werden als:
void printPair(const std::pair<auto, auto>& p) {
std::cout << p.first << ", " << p.second;
}
Es kompiliert und funktioniert gut mit der experimentellen GCC-Implementierung für Konzepte.
Ist es eine legitime Syntax mit C ++ 20?
auto
direkt Templatisierttypename XYZ
, was stark bedeuten würde, dass es sich um die legitime Syntax handelt. Ordentlich .auto
erlaubt ist .[](const std::pair<auto, auto>& p){}
-std=c++2a
-std=c++17
Antworten:
Diese Syntax ist in der technischen Spezifikation für C ++ - Konzepte gültig, jedoch nicht in C ++ 20. In C ++ 20-Konzepten
auto
ist dies nur auf oberster Ebene in einem Funktionsparametertyp zulässig. Die relevante Regel ist [dcl.spec.auto] Absatz 2 :(Wenn Sie den Wortlaut des letzten Arbeitsentwurfs zum Zeitpunkt des Schreibens überprüfen, werden Sie eine etwas andere Regel finden. Die obige Regel wurde durch die Kernausgabe 2447 geändert , die in den endgültigen Entwurf von C ++ 20 in Prag aufgenommen wurde Ausschusssitzung vor einer Woche.)
Die Deklarationsspezifizierer in einem Funktionsparameter sind die anfängliche Folge von Schlüsselwörtern und Typnamen zu Beginn der Parameterdeklaration. Die obige Regel erlaubt
auto
dort auf oberster Ebene:... aber nur als Deklarationsspezifizierer .
auto
ist nicht zulässig, wenn es in einem Deklarationsspezifizierer verschachtelt ist :... und ist auch an anderer Stelle im Parametertyp nicht zulässig:
quelle
auto
für einen nachfolgenden Rückgabetyp als diese Art derauto
Verwendung gezählt wurden.