Re: placement new (this) в конструкторе
От: N. I.  
Дата: 29.03.18 14:00
Оценка: 18 (3) :)))
σ:

σ>Вопрос ИСКЛЮЧИТЕЛЬНО юридический


Статья 273 УК

σ>Мне встречалось утверждение что вызов другого конструктора изнутри данного:

σ>
σ>Klass::Klass(some_params)
σ>{
σ>    new (this) Klass(other_params);
σ>}
σ>

σ>приводит к UB.

σ>Это так или нет? И почему?


Похоже на неявное undefined behavior — это когда в стандарте попросту нет описания того, как некая конструкция должна работать. Насколько я вижу, формально объект, создаваемый конструктором Klass(some_params), и объект, создаваемый выражением new (this) Klass(other_params), — это два разных объекта, и какой там винегрет получится при попытке перезаписать чем-то левым память первого объекта в процессе его создания, непонятно. Закончить время жизни первого объекта создание второго не может, т.к. время жизни первого ещё не началось (из тела конструктора ещё не вышли). В общем, что мы имеем:

1. Допустимость делать reuse памяти для объекта under construction и/или последствия такого действия, вроде, нигде не прописаны.

2. В каком состоянии будет пребывать программа в момент, когда должно стартануть время жизни первого объекта (чью память мы вероломно перезаписали каким-то другим объектом, который не подпадает под специальный случай для subobjects), тоже нигде не прописано.

3. Гарантий, что над этим винегретом из двух объектов в дальнейшем допустимо делать какие-то осмысленные операции, у нас опять же нет.

Тут, пожалуй, можно подумать над тем, когда именно ожидать возникновение undefined behavior: в момент входа управления в конструктор второго объекта, в момент выхода управления из конструктора первого объекта или же в момент первой попытки сделать с их сочетанием что-нибудь такое, что требует наличие валидного объекта. Пожалуй, я бы поставил на первый вариант — возникновение undefined behavior прямо на входе управления в конструктор второго объекта (из соображений п.1 выше).
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.