C ++ 20 permet d'utiliser le auto
type de paramètre de fonction.
Cela permet-il également d'utiliser auto
comme espace réservé d'argument de modèle (pas similaire, mais dans l'esprit du modèle C ++ 17 <auto> d'une certaine manière) pour le type de paramètre de fonction?
Donc le code suivant, pré C ++ 20:
template<typename First, typename Second>
void printPair(const std::pair<First, Second>& p) {
std::cout << p.first << ", " << p.second;
}
Pourrait être écrit comme:
void printPair(const std::pair<auto, auto>& p) {
std::cout << p.first << ", " << p.second;
}
Il compile et fonctionne bien avec l'implémentation expérimentale de GCC pour les concepts.
Est-ce une syntaxe légitime avec C ++ 20?
auto
se traduit directement en modèletypename XYZ
, ce qui impliquerait fortement que c'est la syntaxe légitime. Neat .auto
est autorisé à entrer[](const std::pair<auto, auto>& p){}
(que ce soit avec-std=c++2a
ou-std=c++17
).Réponses:
Cette syntaxe est valide dans la spécification technique des concepts C ++, mais pas dans C ++ 20. Dans les concepts C ++ 20,
auto
n'est autorisé qu'au niveau supérieur dans un type de paramètre de fonction. La règle pertinente est [dcl.spec.auto] paragraphe 2 :(Si vous vérifiez le libellé du projet de travail le plus récent au moment de la rédaction, vous trouverez une règle quelque peu différente. La règle ci-dessus a été modifiée par le problème principal 2447 , qui a été voté dans le projet final C ++ 20 à Prague réunion du comité il y a une semaine.)
Les spécificateurs de déclins dans un paramètre de fonction sont la séquence initiale de mots clés et de noms de type au début de la déclaration de paramètre. La règle ci-dessus permet
auto
au niveau supérieur:... mais uniquement en tant que spécificateur décl .
auto
n'est pas autorisé lorsqu'il est imbriqué dans un spécificateur décl :... et n'est également pas autorisé ailleurs dans le type de paramètre:
la source
auto
pour un type de retour de fin comptaient comme ce type d'auto
utilisation.