#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, зато понятно, что имеется в виду. templateinline U* pointer_cast(T* p) { void* t = p; return static_cast(t); }
Комментариев нет:
Отправить комментарий