Каковы изменения, если таковые имеются, правилам инициализации memcpy в новом стандарте?
Насколько мне известно, memcpy
в неинициализированное хранилище не может безопасно использоваться для создания копии исходного объекта.
Однако в этот поток за последний год в открытом списке WG21 "Ub" участник ссылается на новый срок жизни memcpy правила инициализации:
Это, похоже, не поднимается до уровня отчета об ошибке, но может иметь отношение к новым правилам инициализации жизни memcpy. Будут ли они приписать некоторый статический тип в исходный и конечный байты?
В зависимости от контекста вопроса и небольшого количества примерного кода типа-стирания, он может быть связан с созданием новых объектов в aligned_storage
через memcpy
.
Поиск, как я мог, я не могу найти ссылку на новые правила. Мне особенно любопытно, если они применимы только к замене содержимого уже созданного объекта или изменению ситуации вокруг потенциального создания объекта в неинициализированной памяти.
Ответы
Ответ 1
Формулировка немного изменилась, но общая идея не изменилась. Из intro.object:
Объект создается определением новым выражением при неявном изменении активного члена объединения или при создании временного объекта ([conv.rval], [class.temporary]).
Это единственные четыре способа создать объект на С++. memcpy
не попадает ни в один из этих четырех условий и, следовательно, теперь он (и никогда не имел) создал жизнь (неявное изменение активного члена объединения может быть выполнено только через =
, а не через memcpy
).
Цитата относится к гипотетическому будущему изменению стандарта, который будет благословлять memcpy
такой способностью в определенных ситуациях. В начале этого года существовал очень длинный поток.