Как указано в cppreference, требование для типа T быть CopyConstructible означает, что он также будет MoveConstructible.
Черновик концепции STL CopyConstructible содержит:
template <class T> concept CopyConstructible = std::MoveConstructible<T> && std::Constructible<T, T&> && std::ConvertibleTo<T&, T> && std::Constructible<T, const T&> && std::ConvertibleTo<const T&, T> && std::Constructible<T, const T> && std::ConvertibleTo<const T, T>;
который поддерживает именованный оператор требования. Учитывая приведенное выше определение, тип вроде:
struct HaveCopy {
HaveCopy(const HaveCopy&) = default;
HaveCopy(HaveCopy&&) = delete;
HaveCopy& operator= (const HaveCopy&) = default;
HaveCopy& operator= (HaveCopy&&) = delete;
};
не проходит простой тест:
static_assert(std::CopyConstructible<HaveCopy>);
тогда как он передает старый:
static_assert(std::is_copy_constructible<HaveCopy>::value);
Итак, вопрос: почему? Каковы намерения комитета по стандартам в этом вопросе? HaveCopy не может быть перестроен, но, на мой взгляд, в значительной степени копируем, и std::is_copy_constructible<>
согласен со мной.
Такое же поведение наследуется концепцией Copyable, а именно:
template <class T> concept Copyable = std::CopyConstructible<T> && std::Movable<T> && std::Assignable<T&, const T&>;
Итак тест:
static_assert(std::Copyable<HaveCopy>);
тоже не получится. На этот раз провал удваивается. И CopyConstrucible<>
, и Movable<>
не согласны с тем, что HaveCopy можно копировать.
Обсуждение здесь чем-то похоже, но не отвечает на вопрос почему< /сильный>. Зачем нам нужно такое поведение? Исключает ли этот тип проверки действительные конструируемые типы копирования или HaveCopy вообще не конструирует копирование? Последнее кажется мне действительно странным, если это правда.
Какие-нибудь мысли?
CopyConstructible
, оно автоматически становитсяMoveConstructible
, вы не можете заметить разницу, и на самом деле это не дополнительное требование. - person 463035818_is_not_a_number   schedule 06.02.2019T
, который может быть создан изconst T &
, может быть создан изT &&
из-за неявного преобразованияT &&
вconst T &
. может быть создан изT &&
так определяется MoveConstructible - person Caleth   schedule 06.02.2019HaveCopy
, это не обязательно так. Это правда, что конструктор копирования был бы кандидатом, но неверно, что конструктор копирования обязательно является лучшим кандидатом. - person Barry   schedule 06.02.2019