Здравствуйте, σ, Вы писали:
σ>Вопрос ИСКЛЮЧИТЕЛЬНО юридический, с точки зрения стандарта языка.
σ>Мнения про недопустимость такого стиля и предложения заменить на delegating constructors не интересуют.
σ>Так вот. Мне встречалось утверждение что вызов другого конструктора изнутри данного:
σ>σ>Klass::Klass(some_params)
σ>{
σ> new (this) Klass(other_params);
σ>}
σ>
σ>приводит к UB.
Это UB.
Для каждого объекта, для которого вызван конструктор, должен быть вызван деструктор.
Для объектов, управляемых через placement new / delete деструкторы должны быть вызваны
руками. тут этого нет. Конструктор Klass уже сработал, а деструктор его не вызывается.
Объект, конструируемый по placement new также должен создаваться на базе памяти, в которой
не существует валидного (т.е. не прошедшего через деструктор) объекта. Тут это тоже не
соблюдается.