Поскольку P0593 неявное создание объектов для низкоуровневой манипуляции с объектами было принято, объекты теперь можно создавать неявно в C ++ 20.
В частности, формулировка, предложенная предложением, позволяет определенным операциям (таким как std::malloc
) автоматически создавать и запускать время жизни объектов определенных типов, так называемые типы неявного времени жизни , если введение таких объектов приведет к тому, что программа с иным неопределенным поведением будет иметь определенное поведение. Смотрите [intro.object] / 10 .
Теперь в проекте также указывается, что, если существует несколько наборов таких объектов, которые можно было бы создать неявно, чтобы придать программе определенное поведение, неизвестно, какой из этих наборов создан. (Соответствующее предложение, по-видимому, отсутствует в последней редакции предложения, к которой я мог получить доступ, R5, но содержится в проекте коммита.)
Есть ли на самом деле программа, для которой этот выбор неявно созданного набора объектов является наблюдаемым? Другими словами, существует ли программа с определенным, но неуказанным поведением с помощью этого нового правила, так что можно из вывода вывести, какие наборы типов неявных объектов (из нескольких возможных) были созданы?
Или это предложение просто предназначено для разъяснения выполнения программы на абстрактной машине (без заметного влияния)?
источник
std::malloc
), иначе вы получите проблемы с определением быть рекурсивным в зависимости от будущего.Ответы:
Давайте возьмем пример в стандарте и немного изменим его:
Ранее существовал только один набор допустимых объектов, которые могли бы быть неявно созданы в этом хранилище - это должен быть ровно один
X
. Но теперь у нас есть память для двухX
с, но только запись в один из них, и ничто в этой программе никогда не затрагивает остальные байты. Таким образом, существует множество различных наборов объектов, которые могут быть созданы неявным образом - возможно, дваX
с, может бытьX
и дваint
, а может бытьX
и восемьchar
с ...Неизвестно, какой набор создан, потому что, если бы были какие-либо фактические наблюдения, это уменьшило бы возможности только тех наборов, которые были действительны. Если бы мы сделали что-то подобное,
p[1]->a = 3
то вселенная возможностей рухнет до одной с двумяX
s.Другими словами, множественные наборы неявно созданных объектов возможны только тогда, когда в программе недостаточно наблюдений, чтобы различить их достоверность. Если бы был способ различить, то по определению они не были бы действительными.
источник
char
,unsigned char
илиstd::byte
? Полагаю, там может существовать объект любого тривиально копируемого типа?X
объектом.