Почему класс, унаследованный от лямбда-типа, не преобразуется в указатель на функцию в Visual C++?C++

Программы на C++. Форум разработчиков
Anonymous
Почему класс, унаследованный от лямбда-типа, не преобразуется в указатель на функцию в Visual C++?

Сообщение Anonymous »

Если лямбда не содержит захвата, ее тип замыкания имеет оператор преобразования в указатель на функцию. Например,

Код: Выделить всё

auto l = []{};
using F = decltype(+l); //pointer to function type
constexpr F p = l;
И если класс наследует тип замыкания, разумно ожидать, что оператор преобразования также наследуется. Но в компиляторе MSVC это не так, и это нужно явно определить:

Код: Выделить всё

using L = decltype(l);
struct A : L {
//only required for MSVC:
constexpr operator F() { return static_cast(*this); }
};
constexpr F q = A{};
Без оператора A::F() MSVC жалуется:

Код: Выделить всё

error C2440: 'initializing': cannot convert from 'A' to 'const F'
note: No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called
Онлайн-демо.
Я подумал, что это каким-то образом связано с наличием в MSVC нескольких операторов преобразования для различных соглашений о вызовах, как описано здесь. Но созданный вручную класс с аналогичными преобразованиями допускает наследование операторов преобразования, онлайн-демо.
Почему тогда наследование не работает для типов замыканий, как ожидалось?

Подробнее здесь: https://stackoverflow.com/questions/798 ... on-pointer

Вернуться в «C++»