Лямбда, которая распадается на указатель и не требует спецификации - PullRequest
0 голосов
/ 27 августа 2018

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

int main() {
    void(*ptr)() noexcept = []() noexcept {
        // ...
    };
}

Он компилируется с помощью gcc / clang, но не компилируется с msvc.
Ошибка довольно неясна:

ошибка C2440: «инициализация»: невозможно преобразовать из «main ::» в «void (__cdecl *) (void) noexcept»
примечание: отсутствует пользовательский оператор преобразования, который может выполнить это преобразование, или оператор не может быть вызван

Все работает нормально, если я удаляю noexcept следующим образом:

int main() {
    void(*ptr)() = []() noexcept {
        // ...
    };
}

Насколько я вижу, код верен, и msvc должен принимать его так же, как gcc и clang. Что-то не так во фрагменте или это ошибка msvc?

...