Требование для явного преобразования типа - PullRequest
2 голосов
/ 30 августа 2011

Для static_cast. Правда ли, что, если не существует встроенной функции преобразования типов, вы не можете использовать static_cast для выполнения преобразования.Но вы можете сделать reinterpret_cast для типа, учитывая, что возвращаемый тип является допустимым.

int main()
{
    WORD word;
    HWND hwnd = static_cast<HWND>(word); // error
    HWND hwnd = reinterpret_cast<HWND>(word); // ok, considering a valid handle is returned.
}

Требуется ли для явных преобразований типов, выполняемых со static_cast, функция преобразования в отличие от reinterpret_cast?

Ответы [ 3 ]

2 голосов
/ 30 августа 2011

reinterpret_cast просто позволяет конвертировать совершенно не связанные типы. Это просто обрабатывает кусок памяти как другой тип. Поэтому использовать его очень небезопасно, поскольку он не дает никаких ошибок компиляции или времени выполнения, а просто вызывает (обычно) сбой

static_cast обеспечивает проверку правильности приведения во время компиляции. Если тип не может быть обработан как другой тип, тогда static_cast выдает ошибку времени компиляции при попытке приведения. Он выполняет неявные преобразования между типами (например, int в float или указатель на void *), а также может вызывать явные функции преобразования (или неявные).

Таким образом, вы можете сказать, что он может выполнять неявное приведение, для которого имеется встроенная функция неявного преобразования. Обычно это считается заменой приведения в стиле c, если это путаница.

0 голосов
/ 30 августа 2011

В основном static_cast выделяет память для совместимого класса размер адресата типа и заполняет его что возможно , но без любой проверка того, что новый объект завершен .Позвольте мне привести пример:

class A {
public:
    int a;
};

class B : public A {
public:
    int c;
    int b;
};

int main()
{
    A *a = new A;
    a->a = 5;
    B *b = new B;
    b->a = 6;
    b->b = 7;
    b->c = 8;

    B* bb = static_cast<B*>(a);
    A* aa = static_cast<A*>(b);

    cout << bb->a << endl; // 5
    cout << bb->b << endl; // scrap value from memory
    // member b was not initialized, because it was not found in A

    cout << aa->a << endl; // 6

    return 0;
}

В вашем примере статическое приведение недопустимо, поскольку hwnd равно void *, а word равно unsigned short.Для приведений c ++ любой тип может рассматриваться как класс;

reinterpret_cast работает всегда .Это просто двоичная копия

0 голосов
/ 30 августа 2011

Приведение типов в C ++ наиболее целесообразно при приведении указателей и ссылок.

Конкретные примеры

void foo (Base & b) {
    if (b .is_a_Foo ())
        static_cast <Foo &> (b) .bar ();
    else
        b .do_default_bar ();
    dynamic_cast <Baz &> (b) .something (); // throws if invalid conversion
}

char data [4];
* reinterpret_cast <float *> (data) = 1.23;

API Windows - ужасный взлом сверху вниз - в вашем примере reinterpret_castверен первоначальному замыслу (и подчеркивает его для восхищения всего мира), и это в основном означает «отбросить систему типов и использовать необработанные биты: поверьте мне».

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