Трябва ли неулавяните общи ламбда да се разпадат до функционални указатели?

Разгледайте следния код:

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