По результатам этой темы
Я написал программу типа
void test1(){}
int main() {
auto test2 = [](){};
printf("%p\n%p\n", test1, &test1);
printf("%p\n%p", test2, &test2);
return 0;
}
результат
0x561cac7d91a9
0x561cac7d91a9
0x7ffe9e565397
(ноль)
на https://www.programiz.com/cpp-programming/online-compiler/
Итак, test2 хранит указатель функции на лямбда-функцию?
а у меня вопрос, что объект test2, в котором хранятся лямбда данные, не имеет собственного адреса?
Я думал, что этот test2 должен иметь свой собственный адрес.
@VioletGiraffe Я имею в виду test1
против &test1
. Я не думаю, что они могут быть разными
Имеет ли объект, хранящий лямбда-функцию, собственный адрес?
Да, как и все объекты в C++, переменная test2
тоже имеет уникальный адрес. Вы можете увидеть это, напечатав &test
uisng cout
, как показано ниже:
int main() {
auto test2 = [](){};
std::cout << &test2; //prints address of test2
return 0;
}
Вывод вышеуказанной модифицированной программы:
0x7ffe4d4b5fcf
test2
хранит вызываемый объект. Его тип — класс сoperator()
. Функция, очень похожая на массив, может распадаться на указатель, поэтому вы видите один и тот же адрес в первых двух выводах.