static_cast, кажется, работает, когда не может работать - PullRequest
0 голосов
/ 29 мая 2020

В следующем коде я использую static_cast<B*> для void*, который указывает на объект A.

A и B никак не связаны. Я понимаю, что компилятор не может выдать ошибку. Но я не понимаю, почему это действительно работает при запуске ...? Я бы ожидал, что произойдет ошибка сегментации или какая-то ошибка.

#include <iostream>

using namespace std;

class A {
    public:
    void f() const {
        cout << "f" << endl;
    }
};

class B {
    public:
    void q() {
        cout << "q" << endl;
    }
};

int main(int argc, char** argv) {
    A a;
    void* p = &a;

    static_cast<B*>(p)->q(); // Prints "q"!

    return 0;
}

Каков механизм этого?

Ответы [ 2 ]

3 голосов
/ 29 мая 2020

Код вызывает неопределенное поведение (поскольку он разыменовывает B *, который не указывает на объект B), что означает, что может произойти все, что угодно. Вы не должны ожидать каких-либо конкретных последствий.

Чтобы узнать, что сделал ваш компилятор, вы можете проверить сборку. Я предполагаю, что компилятор сгенерировал сборку, которая была бы правильной, если бы там был объект B: вызовите функцию B::q() с неявным аргументом p.

0 голосов
/ 29 мая 2020

почему это действительно работает при запуске ...?

Потому что поведение программы не определено.

Я ожидал segfault или какая-то ошибка.

Когда поведение не определено, нет гарантии, что будет segfault или какая-то ошибка. Такого вообще было бы неразумно. Когда поведение не определено, нет никаких гарантий.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...