Проблема заключается в следующем:
template <typename T, typename... Others>
concept are_same = (... && std::same_as<T, Others>);
Является ли нормализованная форма этого понятия ... именно этим. Мы не можем «раскрыть» это (ничего не поделаешь), и текущие правила не нормализуются через «части» концепции.
Другими словами, для этого нужноВаша концепция нормализовать в:
... && (same-as-impl<T, U> && same-as-impl<U, T>)
в:
... && (is_same_v<T, U> && is_same_v<U, T>)
И рассмотреть одно ограничение сложения-выражения &&
, чтобы включить другое ограничение выражения-складки &&
, если оно лежит в основе ограничениявключает в себя основное ограничение другого. Если бы у нас было это правило, это помогло бы вашему примеру работать.
Возможно, это удастся добавить в будущем - но проблема правил подстановки заключается в том, что мы не хотим, чтобы компиляторы выкладывались полностьюи реализовать полный решатель SAT, чтобы проверить включение ограничений. Не похоже, что это делает его намного более сложным (мы бы просто добавили правила &&
и ||
через выражения сгиба), но я действительно понятия не имею.
Примечаниеоднако, что даже если бы у нас было такое подчинение выражению сгиба, are_same<T, U>
все равно не включало бы std::same_as<T, U>
. Это будет только включать are_same<U, T>
. Я не уверен, возможно ли это вообще.