Как указано в 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 вообще не копируется конструктивно?Последнее кажется мне действительно странным, если это правда.
Есть мысли?