Ответ 1
Объекты имеют время жизни; функций нет. Функции не живут и не умирают; они всегда существуют. Таким образом, функция не может выходить "из области видимости", и функция, на которую указывает предыдущий действительный указатель функции, исчезает. Независимо от того, откуда они берутся, указатели на функции всегда действительны.
Теперь это игнорирует динамическую загрузку и т.д., но это нестандартное поведение.
Указатель функции, который вы возвращаете из лямбда, является указателем на функцию. Это не особенное или волшебное. Поэтому он ведет себя не иначе, как любой другой указатель функции.
Возможно ли, что результат преобразования в void (*)() указывает на то, что вызывает функцию-член, связанную с каким-либо объектом?
Это гораздо более сложный вопрос. Тот, который стандарт кажется довольно недооцененным. Стандарт только говорит:
адрес функции, которая при вызове имеет тот же эффект, что и вызов вызывающего оператора функции замыкания.
То, что означает "тот же эффект" , - это вопрос. Можно утверждать, что "тот же эффект" означает выполнение того, что сделал оператор вызова функции, выполняя ту же последовательность утверждений. Можно также утверждать, что "тот же эффект" означает вызов самого объекта замыкания.
Последний случай может показаться сложным для реализации, но помните, что магия компилятора может быть использована. Закрытие может возвращать указатель функции, специфичный для экземпляра, который назначается закрытием по запросу. Или некоторые-такие.
Ненормативный текст, по-видимому, не очень подходит по этому вопросу. Существует пример закрытия для (generic) лямбда, который говорит следующее:
template<class T> auto operator()(T t) const { ... } template<class T> static auto lambda_call_operator_invoker(T a) { // forwards execution to operator()(a) and therefore has // the same return type deduced ... }
В рассматриваемом комментарии предлагается пересылка, но для этого требуется, чтобы статический вызов создавал новый экземпляр лямбда для выполнения пересылки с помощью.
В целом, стандарт не дает понять, является ли обращение к сгенерированному указателю функции после уничтожения закрытия.