Если память выделена с помощью malloc (в отличие от new) и объект перемещен в эту память, является ли это допустимым C ++?
Потенциально;Не обязательно.
Если мы рассмотрим перемещение-конструкцию, то, конечно, вы можете использовать размещение-новый, чтобы создать объект в памяти.Немного похоже на ваш второй пример - за исключением того, что пример делает копию;если итератор не является странным и не возвращает значение.Хотя вы упоминаете, что тип является POD, в этом случае нет разницы между перемещением и копией.
Если мы рассмотрим назначение перемещения, то оно будет четко определено, только если ранее был создан объект вэта память.В вашем первом примере объекты не были созданы, поэтому поведение технически не определено.
Я хотел бы знать [...], работает ли он просто по счастливой случайности или потому, что T оказываетсястручок
Технически UB, но, скорее всего, будет работать, если T
- POD.Этот тип инициализации по присваиванию хорошо определен в C (и это единственный способ динамического создания объектов на этом языке).
Если бы оператор присваивания был нетривиальным, то вещи, скорее всего, сломались бы.
Чтобы переместить ряд объектов в неинициализированную память, вы, вероятно, захотите использовать std::uninitialized_move
.Он будет хорошо определен независимо от тривиальности типа, и вам даже не нужно писать цикл.