Информация об изменениях

Сообщение Re: Проверка концептов внутри типа от 10.12.2024 9:47

Изменено 10.12.2024 10:26 rg45

Re: Проверка концептов внутри типа
Здравствуйте, 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 внутрь функции-члена.
Re: Проверка концептов внутри типа
Здравствуйте, 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. Возможно также, что это повод для того, чтобы пересмотреть дизайн на предмет избыточных и циклических зависимостей между типами.