C ++ 20 pozwala na użycie auto
typu parametru funkcji.
Czy pozwala również na użycie auto
jako symbolu zastępczego argumentu szablonu (nie podobnego, ale w duchu szablonu C ++ 17 <auto> w pewien sposób) dla typu parametru funkcji?
Tak więc następujący kod sprzed C ++ 20:
template<typename First, typename Second>
void printPair(const std::pair<First, Second>& p) {
std::cout << p.first << ", " << p.second;
}
Można zapisać jako:
void printPair(const std::pair<auto, auto>& p) {
std::cout << p.first << ", " << p.second;
}
To nie kompiluje i działa ładnie z eksperymentalnej realizacji GCC dla pojęć.
Czy jest to poprawna składnia w C ++ 20?
auto
bezpośrednio przekłada się na szablonytypename XYZ
, co zdecydowanie sugeruje, że jest to uzasadniona składnia. Schludny .auto
jest dozwolone w[](const std::pair<auto, auto>& p){}
(czy z-std=c++2a
lub-std=c++17
).Odpowiedzi:
Ta składnia jest poprawna w specyfikacji technicznej pojęć C ++, ale nie w C ++ 20. W koncepcjach C ++ 20
auto
jest dozwolony tylko na najwyższym poziomie w typie parametru funkcji. Właściwą zasadą jest [dcl.spec.auto] ust. 2 :(Jeśli sprawdzisz sformułowania w najnowszym roboczym szkicu w momencie pisania, znajdziesz nieco inną zasadę. Powyższa zasada została zmodyfikowana przez główny numer 2447 , który został głosowany w ostatecznym projekcie C ++ 20 w Pradze posiedzenie komitetu tydzień temu.)
Specyfikator deklinacji w parametrze funkcji jest początkową sekwencją słów kluczowych i nazw typów na początku deklaracji parametru. Powyższa reguła pozwala
auto
na najwyższym poziomie:... ale tylko jako specyfikator deklaracji .
auto
nie jest dozwolone, gdy jest zagnieżdżone w specyfikatorze decl :... i jest również niedozwolony gdzie indziej w typie parametru:
źródło
auto
końcowego typu zwrotu liczone są jako tego rodzajuauto
użycie.