Должен ли не захватывающий общий лямбда разлагаться, чтобы функционировать указатели?

Рассмотрим следующий код:

int main() {
auto l = [](auto){};
void(*p)(int) = l;
}

Он отлично работает как с НКУ а также лязг.
Давайте рассмотрим следующую слегка модифицированную версию:

int main() {
auto l = [](auto...){};
void(*p)(int) = l;
}

В этом случае лязг по-прежнему принимает это в то время как GCC отвергает это.

Есть ли причина, по которой этот код должен быть отклонен, или это ошибка компилятора?


Я собираюсь открыть вопрос, но я хотел бы знать, существует ли какое-либо предложение, которое могло бы быть реализовано одним из них, а не другим.

7

Решение

Это известная ошибка разбора GCC (64095, 68071): [](auto...){} по ошибке разбирается как [](auto, ...) {} скорее, чем [](auto...x){}; многоточие анализируется как переменные в стиле C, а не объявляет пакет параметров (в терминах языка-юриста, оно анализируется как часть Параметр декларирование придаточного а не абстрактно-описатель, в нарушение [Dcl.fct] / 17).

Само собой разумеется, что [](auto, ...){} не конвертируется в void (*)(int),

Обходной путь должен дать пакету имя; если вы это сделаете, вы увидите, что преобразование успешно компилируется.

11

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]