https://gcc.gnu.org/bugzilla/show_bug.cgi?id=108169
--- Comment #2 from Andrew Pinski <pinskia at gcc dot gnu.org> --- Hmm, take: ``` struct W { constexpr W(int i) : i(i) {} int i; }; template <auto V> struct S { static constexpr decltype(V) &t = V; }; int main() { const W *t = &S<W(2)>::t; } ``` Clang produces: ``` <source>:7:35: error: binding reference of type 'decltype(W{2})' (aka 'W') to value of type 'const W' drops 'const' qualifier static constexpr decltype(V) &t = V; ^ ~ <source>:10:28: note: in instantiation of static data member 'S<W{2}>::t' requested here const W *t = &S<W(2)>::t; ^ ``` So clang thinks V is const too in some cases .... Even MSVC produces: ``` <source>(7): error C2440: 'initializing': cannot convert from 'const W' to 'W &' <source>(7): note: Conversion loses qualifiers <source>(10): note: see reference to class template instantiation 'S<W{int:2}>' being compiled ``` Notice the `const W` there. Note for scalar types (though float is broken for clang because it is not implemented yet), it is always non-const ...