Здравствуйте, K13, Вы писали:
K13>K13>#include <concepts>
K13>template< typename T >
K13>concept cloneable = requires( T x )
K13>{
K13> { x.clone() } -> std::convertible_to<T*>;
K13>};
K13>template< cloneable T >
K13>struct OnlyCloneable {};
K13>struct Foo
K13>{
K13> Foo* clone() const { return new Foo(*this); }
K13> //using Ptr1 = OnlyCloneable<Foo>; // если раскомментарить, то ошибка компиляции
K13>};
K13>using Ptr2 = OnlyCloneable<Foo>;
K13>static_assert( cloneable<Foo> );
K13>int main()
K13>{
K13> return 0;
K13>}
K13>
K13>Вопрос -- это как-то лечится?
K13>Почему проваливается проверка концепта внутри типа, хотя наличие метода clone компилятору уже известно?
Почему, понятно — потому что в этой точке Foo ещё не является полным типом. Примерно то же получится, если в этой точке попытаться полчучить sizeof(Foo). Выход сходу вижу только один — заводить Ptr1 внутрь функции-члена.
P.S. Возможно также, что это повод для того, чтобы пересмотреть дизайн на предмет избыточных и циклических зависимостей между типами.