Почему создается объект, если я пытаюсь напечатать адрес не-функции c члена класса в c ++? - PullRequest
0 голосов
/ 17 апреля 2020

Я обнаружил одно интересное поведение, когда просто проверял смещения нестандартных 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

1 Ответ

3 голосов
/ 17 апреля 2020

Странное поведение, которое вы видите - неопределенное поведение, вызванное следующей строкой:

FP fp = reinterpret_cast<FP>(&AAA::foo);

Даже без вызова fp это уже неопределенное поведение! Только перечисленные преобразования действительны для reinterpret_cast ( [expr.reinterpret.cast] ), и то, что вы используете (указатель на функцию-член на указатель на функцию), не одно из них.

Распространенным заблуждением является то, что reinterpret_cast - это бросок «все идет», который позволяет обойти безопасность типов любым возможным способом. Согласно стандарту, это не так; допустима только небольшая часть указанных c преобразований. Все остальные нет (но не требуют диагностики, что в любом случае приводит к их использованию).

...