C ++ 20 позволяет использовать auto
для параметра типа функции.
Позволяет ли он также использовать auto
в качестве заполнителя аргумента шаблона (не похоже, но в духе C ++ 17 template <auto> в некотором смысле) для типа параметра функции?
Итак, следующий код, предварительно C ++ 20:
template<typename First, typename Second>
void printPair(const std::pair<First, Second>& p) {
std::cout << p.first << ", " << p.second;
}
Может быть написано как:
void printPair(const std::pair<auto, auto>& p) {
std::cout << p.first << ", " << p.second;
}
Он компилируется и прекрасно работает с экспериментальной реализацией GCC для концепций.
Это законный синтаксис с C ++ 20?
auto
напрямую переводится в шаблонизированныйtypename XYZ
, что сильно подразумевает, что это законный синтаксис. Ухоженная .auto
, разрешено[](const std::pair<auto, auto>& p){}
ли (с-std=c++2a
или с-std=c++17
).Ответы:
Этот синтаксис действителен в Технической спецификации концепций C ++, но не в C ++ 20. В концепциях C ++ 20
auto
допускается только на верхнем уровне в типе параметра функции. Соответствующее правило - [dcl.spec.auto] параграф 2 :(Если вы проверите формулировку в самом последнем рабочем проекте на момент написания, вы найдете несколько иное правило. Вышеупомянутое правило было изменено основным вопросом 2447 , который был утвержден в окончательном варианте C ++ 20 в Праге. заседание комитета неделю назад.)
Спецификатор decl s в параметре функции является начальной последовательностью ключевых слов и имен типов в начале объявления параметра. Приведенное выше правило позволяет
auto
на верхнем уровне:... но только как спецификатор decl .
auto
не допускается, если вложен в спецификатор decl :... и также не разрешено где-либо еще в типе параметра:
источник
auto
для конечного возвращаемого типа считаются этим видомauto
использования.