Некоторые авторы используют двойное преобразование через void*
с помощью static_cast
, вида:
long* px;
char* p = static_cast<char*>(static_cast<void*>(px));
вместо reinterpret_cast
:
long* px;
char* p = reinterpret_cast<char*>(px);
В чем преимущество/недостатки первого варианта?
Двойное преобразование static_cast
с преобразованием в void*
на первом шаге ограничивает возможный тип аргумента указателем, и не позволяет использовать в качестве него целый тип. Пример:
int i = 42;
int* p = nullptr;
// Различное поведение при использовании целого аргумента
static_cast<short*>(static_cast<void*>(i)); // ошибка компиляции
reinterpret_cast<short*>(i); // ok
// Эквивалентны при использовании аргумента указателя
static_cast<short*>(static_cast<void*>(p)); // ok
reinterpret_cast<short*>(p); // ok
Вообще-то один static_cast
даже лишний, можно определить шаблонную функцию специально для указателей, нельзя записать в строчку, как вариант с двумя static_cast
, зато понятно, что имеется в виду.
template <typename U,typename T>
inline U* pointer_cast(T* p)
{
void* t = p;
return static_cast<U*>(t);
}
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Насколько я понимаю, в enable_shared_from_this определен свой деструкторКак мне написать свой деструктор, в котором нужно закрыть файловый дескриптор,...