Страницы

Поиск по вопросам

вторник, 10 декабря 2019 г.

Двойной static_cast через void*, вместо reinterpret_cast

#cpp


Некоторые авторы используют двойное преобразование через void* с помощью static_cast,
вида:

long* px;
char* p = static_cast(static_cast(px));


вместо reinterpret_cast:

long* px;
char* p = reinterpret_cast(px);


В чем преимущество/недостатки первого варианта?
    


Ответы

Ответ 1



Двойное преобразование static_cast с преобразованием в void* на первом шаге ограничивает возможный тип аргумента указателем, и не позволяет использовать в качестве него целый тип. Пример: int i = 42; int* p = nullptr; // Различное поведение при использовании целого аргумента static_cast(static_cast(i)); // ошибка компиляции reinterpret_cast(i); // ok // Эквивалентны при использовании аргумента указателя static_cast(static_cast(p)); // ok reinterpret_cast(p); // ok

Ответ 2



Вообще-то один static_cast даже лишний, можно определить шаблонную функцию специально для указателей, нельзя записать в строчку, как вариант с двумя static_cast, зато понятно, что имеется в виду. template inline U* pointer_cast(T* p) { void* t = p; return static_cast(t); }

Комментариев нет:

Отправить комментарий