Почему то, что может быть одним из наиболее полезных вариантов интерпретации поведения приведения, считается неопределенным поведением? - PullRequest
0 голосов
/ 01 мая 2020

Для некоторого тривиального типа T и для выражения указателя, которое соответствующим образом выровнено и относится к области, по крайней мере, такой же большой, как T, кто-нибудь может сказать мне, почему *reinterpret_cast<T const *>(expr) не просто определен для выполнения то же самое, что и memcpy?

Я полностью понимаю, как может быть UB, если T не является тривиальным, или если expr не соответствует критериям выравнивания T, так что это не проблема в моем вопрос. Я также не спрашиваю, является ли это UB, потому что я уже знаю, что это так. Я спрашиваю, каково обоснование для того, чтобы оставить такое использование reinterpret_cast как UB, учитывая, что вызов memcpy, очевидно, делает то же самое, что и вызов конструктора копирования для тривиального типа (re: http://eel.is/c++draft/basic.types#2 и http://eel.is/c++draft/basic.types#3)

С практической точки зрения кажется, что все компиляторы, поддерживающие C ++ 11 и более поздние версии, в любом случае делают именно это, так что дело не в том, что это то, что UB фактически мешает мне делать то, что я мог бы иначе сделать, но мне интересно, какая возможная причина могла бы оставить это как неопределенное стандартом?

...