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

223
30 декабря 2017, 04:14

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

long* px;
char* p = static_cast<char*>(static_cast<void*>(px));

вместо reinterpret_cast:

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

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

Answer 1

Двойное преобразование 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
Answer 2

Вообще-то один static_cast даже лишний, можно определить шаблонную функцию специально для указателей, нельзя записать в строчку, как вариант с двумя static_cast, зато понятно, что имеется в виду.

template <typename U,typename T>
inline U* pointer_cast(T* p) 
{ 
    void* t = p; 
    return static_cast<U*>(t); 
}
READ ALSO
C++: enable_shared_from_this и деструктор

C++: enable_shared_from_this и деструктор

Насколько я понимаю, в enable_shared_from_this определен свой деструкторКак мне написать свой деструктор, в котором нужно закрыть файловый дескриптор,...

231
Подсчет слов, букв в файле

Подсчет слов, букв в файле

Задача такая: подсчитать количество переменных в файлеТ

232
Помогите перевести выражение на язык С++ [требует правки]

Помогите перевести выражение на язык С++ [требует правки]

Нужно перевести это выражение на С++

262
Оператор перебора for C++

Оператор перебора for C++

В книге Липпмана не работает пример с перебором символов в строке:

226