σ:
σ>Вопрос ИСКЛЮЧИТЕЛЬНО юридический
Статья 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 выше).