https://gcc.gnu.org/bugzilla/show_bug.cgi?id=91742
--- Comment #3 from Jonathan Wakely <redi at gcc dot gnu.org> --- Reduced: #define assert(C) if (!(C)) { __builtin_puts("Assertion failed: " #C); __builtin_abort(); } struct X { X() { } X(const X&) { } }; struct A { operator const X&() const { return a_; } X a_; }; int main() { A a {}; const auto& b1 {static_cast<const X&>(a)}; const X& b2 {a}; assert(&a.a_ == &b1); assert(&b1 == &b2); // does not work with gcc 8.3.0 any standard } Assertion failed: &b1 == &b2 Aborted (core dumped) If "const X& b2 (a)" is used instead of list-init, the second assertion passes.