Почему clang и g++ печатают 0 для a1.v и a2.v в этом примере в С++ 1z?

См. этот пример в [class.base.init]/11

struct A {
  A() = default;          // OK
  A(int v) : v(v) { }     // OK
  const int& v = 42;      // OK
};
A a1;                     // error: ill-formed binding of temporary to reference
A a2(1);                  // OK, unfortunately

Оба clang и g++ компилируют код (clang with an warning), но я хотел бы понять, почему они печатают 0 для членов a1.v и a2.v? См. демо.

Ответ 1

Неважно, что они печатают 0.

Для a1 для начала инициализация плохо сформирована. Для a2 вы привязываете ссылку на временное, чтобы в итоге вы обменивались ссылкой. Нет никакого значения для 0 - это любая память мусора, на которую ссылается ссылка на эту точку. Когда вы нарушаете предварительные условия, программа работает undefined.

Undefined поведение undefined. Нет никаких оснований ожидать определенного поведения для печати. Например, gcc 7 печатает 32764, а clang 4 - 32765. Почему? Почему нет.