Код плохо сформирован.Вы инициализируете i
из буквального 5
, что требует создания временного объекта и привязки к i
.Временный будет уничтожен при выходе из конструктора, затем i
будет зависать, любое последующее обращение к нему приведет к UB, что означает, что все возможно.
Из стандарта [class.base.init] / 8
Временное выражение, привязанное к элементу ссылки в mem-инициализаторе, плохоформируется.[Пример:
struct A {
A() : v(42) { } // error
const int& v;
};
- конец примера]
КСТАТИ: Так как в стандарте указано, что плохо сформирован , компиляторы должны выдавать диагностическую информациюдля этого.Как поведение gcc (выдает предупреждение), так и clang (выдает ошибку) соответствуют друг другу;если VS2017 не выдает никакой диагностики, то он не соответствует стандарту.