У меня есть код (см. Ниже), и, как ни странно, он отлично компилируется, когда я запускаю код через gcc, но когда я открываю тот же файл в Visual Studio 2017, я получаю ошибку компилятора на мелодию:
Error C2440 'reinterpret_cast': cannot convert from '::size_t' to 'Alias'
Вот минимальный пример, который вы можете попробовать, если хотите. Просто нажмите «новый проект», выберите консольное приложение Windows C ++, вставьте этот код и попробуйте скомпилировать в режиме отладки x86 по умолчанию:
#include "stdafx.h"
#include <cstddef>
typedef std::size_t Alias;
Alias makeAlias(std::size_t n)
{
return reinterpret_cast<Alias>(n);
}
int main()
{
std::size_t x = 1;
Alias t = makeAlias(x);
return 0;
}
Как ни странно, если вы измените оператор return на этот немного более запутанный вариант, он действительно компилируется, поэтому похоже, что Visual Studio решила разрешить reinterpret_cast
только для типов указателей:
return *(reinterpret_cast<Alias*>(&n));
Это кажется мне странным решением Visual Studio, потому что, согласно справке по cpp:
В отличие от static_cast, но, как и const_cast, выражение reinterpret_cast не компилируется ни в какие инструкции ЦП. Это чисто директива компилятора, которая инструктирует компилятор обрабатывать последовательность битов (представление объекта) выражения, как если бы она имела тип new_type.
Так что, по крайней мере, мне кажется, что если я попытаюсь reinterpret_cast
между двумя типами, которые занимают память одинаковым образом, то reinterpret_cast действительно будет тем, для чего требуется. В конце концов, я, как следует из названия, «переинтерпретирую» один и тот же битовый шаблон для другого типа.
Я понимаю, что reinterpret_cast
в основном нацелен на преобразование между типами указателей, но я не понимаю, почему мне следует запретить использовать его в подобных ситуациях. В своего рода смысле «используйте правильный инструмент для правильной работы», не будет ли разумнее разрешить программистам использовать reinterpret_cast
по прямому назначению, вместо того, чтобы заставлять их использовать static_cast
, когда в этом нет необходимости (не говоря уже о том, что напрасно прожигает несколько тактов в процессе)?
Есть ли какая-то опасность в разрешении reinterpret_cast
между псевдонимами типов, из-за которой Visual Studio запретит это? Reinterpret_cast
определенно может быть опасным при неправильном использовании, но я не понимаю, почему он должен давать сбой при правильном использовании (если, конечно, я чего-то не упускаю в определении «правильного» использования в этом случае).
makeAlias
был изменен для использования других типов, не являющихся указателями / ссылками, чем то, что у него есть) - person M.M   schedule 02.03.2018T1
иT2
). - person Lightness Races in Orbit   schedule 02.03.2018Alias
было изменено на что-то другое, кромеsize_t
или typedef для того же типа - person M.M   schedule 02.03.2018