По сути, все сводится к тому, что результат операции указателя на указатель reinterpret_cast
нельзя безопасно использовать для чего-либо, кроме приведения к исходному типу указателя.
Вы правы, стандарт был нарушен, но N3242 пытается это исправить:
Определение значения reinterpret_cast<T*>
N3242, [expr.reinterpret.cast]:
Когда значение v типа «указатель на T1» преобразуется в тип «указатель на cv T2», результат равен static_cast<cv T2*>(static_cast<cv void*>(v))
, если и T1, и T2 являются типами стандартной компоновки (3.9), а требования к выравниванию Т2 не строже, чем у Т1.
Это все еще ничего не определяет; для прикола, менее неактуальный текст про static_cast
:
Значение типа «указатель на cv1 void» может быть преобразовано в значение типа «указатель на cv2 T», где T - это тип объекта, а cv2 - это та же квалификация cv, либо более высокая квалификация cv, чем , cv1. Значение нулевого указателя преобразуется в значение нулевого указателя типа назначения. Значение указателя типа на объект, преобразованное в «указатель на cv void» и обратно, возможно с другой квалификацией cv, должно иметь свое первоначальное значение.
"Соответствующим образом преобразованный"
N3242, [class.mem]:
Указатель на объект структуры стандартной компоновки, соответственно , преобразованный с использованием reinterpret_cast
, указывает на его начальный элемент (или, если этот элемент является битовым полем, то на модуль, в котором он проживает) и наоборот.
Что это за стиль? " соответственно "? лол
Очевидно, эти ребята не знают, как написать спецификацию.
C-стиль бросает здесь единственный безопасный вариант?
Это не помогает.
Стандарт нарушен, сломан, сломан.
Но все понимают, что это на самом деле значит. Подтекст стандарта гласит:
Когда значение v типа «указатель на T1» преобразуется в тип «указатель на cv T2», результат равен static_cast<cv T2*>(static_cast<cv void*>(v))
указывает на адрес памяти как v, если оба T1 и T2 являются типами стандартной компоновки (3.9), и требования к выравниванию T2 не являются более строгими, чем требования для T1.
Это, конечно, не идеально (но не хуже, чем во многих других частях стандарта), но через 2 минуты я написал лучшую спецификацию, чем комитет за десятилетие.