Рассмотрим следующий код:
int main() {
auto l = [](auto){};
void(*p)(int) = l;
}
Он отлично работает как с НКУ а также лязг.
Давайте рассмотрим следующую слегка модифицированную версию:
int main() {
auto l = [](auto...){};
void(*p)(int) = l;
}
В этом случае лязг по-прежнему принимает это в то время как GCC отвергает это.
Есть ли причина, по которой этот код должен быть отклонен, или это ошибка компилятора?
Я собираюсь открыть вопрос, но я хотел бы знать, существует ли какое-либо предложение, которое могло бы быть реализовано одним из них, а не другим.
Это известная ошибка разбора GCC (64095, 68071): [](auto...){}
по ошибке разбирается как [](auto, ...) {}
скорее, чем [](auto...x){}
; многоточие анализируется как переменные в стиле C, а не объявляет пакет параметров (в терминах языка-юриста, оно анализируется как часть Параметр декларирование придаточного а не абстрактно-описатель, в нарушение [Dcl.fct] / 17).
Само собой разумеется, что [](auto, ...){}
не конвертируется в void (*)(int)
,
Обходной путь должен дать пакету имя; если вы это сделаете, вы увидите, что преобразование успешно компилируется.
Других решений пока нет …