2016-12-24 2 views
7

Рассмотрим следующий код:Должен ли задерживать родовые расщепления лямбда?

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

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

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

В этом случае, лязг еще accepts it то время как GCC rejects it.

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


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

+1

Компилятор GCC (5.1.0) сообщает вам, что он не реализован: «извините, не реализовано: преобразование lambda, которое использует« ... »для указания функции« –

+0

@latedeveloper Ahahah ... Я попробовал это на мобильном устройстве и сообщение об ошибке был короче (возможно, вырезано), в то время как godbolt на мобильном телефоне далеко не удобен для пользователя. Хороший улов, не видел. Итак, я не буду открывать какую-либо проблему, они уже знают это! Спасибо. Я собираюсь закрыть свой вопрос. – skypjack

+3

Сообщение об ошибке довольно ясно, здесь нет актуального вопроса. – skypjack

ответ

11

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

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

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

Смежные вопросы