Это было недавнее изменение, внесенное в Концепции, которое было принято в Сан-Диего (ноябрь 2018 г.) в результате P1084 . Проблема в том, что раньше это было:
{ E } -> Same<T>;
Фактически означало, что выражение f(E)
действительно для придуманного шаблона функции вида:
template <class U> requires Same<U, T> void f(U );
Что, очевидно, никогда не сохранится для ссылочных типов T
(как в OP).
Другими словами, старое правило гласило: { E } -> Same<T>
означало Same<remove_cvref_t<decltype((E))>, T>
. Новое правило состоит в том, что это означает Same<decltype((E)), T>
. Похоже, что ни gcc -fconcepts
, ни ветвь концептов clang пока не реализуют эти новые правила.
<ч />
Текущий обходной путь должен измениться:
{ E } -> Same<LHS> // i.e. Same<T&>
до:
{ E } -> Same<std::remove_reference_t<LHS>>& // i.e. Same<T>&