Re: Проверка концептов внутри типа
От: rg45 СССР  
Дата: 10.12.24 09:47
Оценка: +1
Здравствуйте, 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. Возможно также, что это повод для того, чтобы пересмотреть дизайн на предмет избыточных и циклических зависимостей между типами.
--
Справедливость выше закона. А человечность выше справедливости.
Отредактировано 10.12.2024 10:26 rg45 . Предыдущая версия . Еще …
Отредактировано 10.12.2024 9:49 rg45 . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.