Чего я не понимаю, так это того, почему генерируется функция static __invoke
, а «функция преобразования» внутренне вызывает __invoke
(непосредственно как указатель на функцию) без какого-либо параметра, ожидаемого __invoke
?
Функция преобразования не "внутренне вызывает" __invoke
, она просто возвращает __invoke
, т.е. указатель на static
функцию-член. Помните, что разница между static
и не static
функциями-членами заключается в том, что первая не связана с конкретным экземпляром этого класса и, следовательно, может рассматриваться как обычные указатели на функции, а не как указатели на члены. Посмотрите на следующий пример:
struct Test {
void f();
static void g();
};
void (Test::*f)() = &Test::f; // pointer to instance-specific member fct.
void (*g)() = &Test::g; // ordinary function pointer
void (*h)() = Test::g; // no ampersand, this is implicitly a function pointer
Последнее - это то, что вы намереваетесь получить в результате преобразования, и то, что cppinsights показывает вам, является не чем иным, как техникой реализации этого преобразования: поскольку лямбда-выражение имеет пустое замыкание, объект функции, сгенерированный компилятором, не имеет состояние, и функция-член объекта без состояния может быть static
функцией-членом, которая может связываться с указателем на обычную функцию.