Почему класс, унаследованный от лямбда-типа, не преобразуется в указатель на функцию в 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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

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