Из комментария к этот ответ :
Члены класса инициализируются в порядке их объявления.По этой логике следующий конструктор должен вызывать неопределенное поведение:
struct Foo
{
Bar a;
Bar b;
Foo(Bar c) : a(b = c) { }
};
Патентно, мы присваиваем b
сначала до инициализации a
.Присвоение неинициализированному объекту должно быть UB.Неудивительно, что код «работает» с Bar = int
, но если я сделаю Bar
тяжелым классом с конструкторами, я вижу, что b
действительно инициализируется до a
.
(дляДополнительное безумие, мы можем даже сказать Foo(Bar c, Bar d) : a(b = c), b(d) { }
, но без предупреждения.)
И все же GCC 4.6.1 не предупреждает об этом.Это приемлемое, четко определенное поведение или это строго неправильно?