#опытным
Давайте для начала поговорим о том, сколько раз можно разыменовать указатель?
Зависит от того, какой указатель мы имеем ввиду.
Тип
int* можно разыменовать всего один раз. Получившийся объект после разыменования будет lvalue int, для которого отсутствует перегрузка operator*:int i = 5;
int * p = &i;
std::cout << **p << std::endl; // error: indirection requires pointer operand ('int' invalid)
Но мы конечно же можем определить указатель на указатель и добиваться очень глубоких уровней индирекции. Однако мы все равно сможем разыменовать такой указатель ровно по количеству этих уровней, не больше:
int i = 5;
int * p = &i;
int ** p1 = &p;
std::cout << **p1 << std::endl; // OK
std::cout << ***p1 << std::endl; // Error
Сколько же раз можно разыменовывать лямбду?
Так стоп. Как в лямбде можно применять оператор?
Лямбда без захвата неявно кастится к указателю на функцию. А указатель можно разыменовывать.
Так сколько?
Бесконечно
#include <iostream>
int main() {
auto ret = *****************************************[]{ return 23; };
std::cout << ret() << std::endl;
}
Чисто технически мы конечно ограничены количеством атомов во вселенной или, что более реально, возможностями компилятора обрабатывать длиннющие тексты программ. Но формальных ограничений нет.
#ЧЗХ?
Давайте подумаем, что происходит при разыменовании лямбды. Она приводится к указателю на функцию, оператор применяется и результатом мы получаем lvalue функции(саму функцию, а не указатель). Тип этого выражения –
int().А функции у нас что любят делать? Правильно, неявно преобразовываться к указателю на саму себя.
Поэтому можем применить оператор еще разик.
А потом еще и еще. И еще, и еще, и еще, и еще... Ну вы поняли.
В любом случае ret по итогам того же неявного преобразования будет иметь тип указателя на фукнцию:
static_assert(std::is_same_v<decltype(ret), int(*)()>);
По тем же рассуждениям, кстати, любой указатель на функцию тоже можно бесконечно разыменовать.
Спасибо, @Ivaneo, за любезно предоставленный примерчик.
Be limited only by your imagination. Stay cool.
#cppcore