Я обнаружил одно интересное поведение, когда просто проверял смещения нестандартных c переменных-членов
Похоже, я пытаюсь напечатать адрес нестандартной c функции-члена в указателе
Он просто создает новый объект для класса, который имеет функцию-член
Это нормальное или неопределенное поведение, которое я могу просто проигнорировать?
, например, если я попробую ниже код
#include <iostream>
typedef void(*FP)();
class AAA {
public:
int var1;
int var2;
void foo() {
std::cout << &var1 << std::endl;
std::cout << &var2 << std::endl;
}
};
int main() {
FP fp = reinterpret_cast<FP>(&AAA::foo);
std::cout << fp << std::endl;
fp();
}
Его результат как ниже
$ ./a.out
0x56001ea8d940
0x7fe36c93c760
0x7fe36c93c764
Итак, я удалил оператор cout
, тогда он просто печатает смещение члена, как я ожидал
#include <iostream>
typedef void(*FP)();
class AAA {
public:
int var1;
int var2;
void foo() {
std::cout << &var1 << std::endl;
std::cout << &var2 << std::endl;
}
};
int main() {
FP fp = reinterpret_cast<FP>(&AAA::foo);
fp();
}
, а его результат похож на ниже
$ g++ main.cpp (with some warnings anyway)
$ ./a.out
0x1
0x5