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

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

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

Он отлично работает как с GCC, так и с clang.
Рассмотрим следующую слегка измененную версию:

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

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

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


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


person skypjack    schedule 24.12.2016    source источник
comment
Компилятор GCC (5.1.0) говорит вам, что он не реализован: извините, нереализовано: преобразование лямбды, которая использует '...' в указатель на функцию   -  person    schedule 25.12.2016
comment
@latedeveloper Ахахах ... Я попробовал это на мобильном телефоне, и сообщение об ошибке было короче (вероятно, вырезано), в то время как Godbolt на мобильном устройстве далеко не удобен для пользователя. Хороший улов, не видел. Так что я не буду открывать тему, они и так это знают!! Спасибо. Я собираюсь закрыть свой собственный вопрос.   -  person skypjack    schedule 25.12.2016
comment
Сообщение об ошибке довольно ясно, здесь нет реальных вопросов.   -  person skypjack    schedule 25.12.2016
comment
Вы просто хотели шапку за голосование, чтобы закрыть вопрос, который сами же и задали, да?   -  person David Hammen    schedule 25.12.2016
comment
@DavidHammen Честно говоря, я даже не знаю, существует ли такая шляпа. Я не настолько интересуюсь этими вещами. Вы предпочитаете, чтобы я удалил вопрос? Я бы просто оставил это для будущих читателей, и с моей точки зрения это имеет гораздо больше смысла, чем шляпа.   -  person skypjack    schedule 25.12.2016
comment
Шучу, @skypjack. Счастливых праздников! Это была бы очень редкая шляпа, если бы она существовала.   -  person David Hammen    schedule 25.12.2016
comment
@DavidHammen :-D ... На самом деле это звучало странно, но есть значки, которые для меня тоже не имеют смысла. Поэтому такая шапка была бы как-то совершенно легальна!! :-)   -  person skypjack    schedule 25.12.2016


Ответы (1)


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

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

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

person T.C.    schedule 24.12.2016