小编hoo*_*oo2的帖子

为什么CopyConstructible类型也必须是MoveConstructible?

cppreference中所述,类型TCopyConstructible的要求是它也是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>;
Run Code Online (Sandbox Code Playgroud)

它支持命名的需求声明.鉴于上述定义,类似于:

struct HaveCopy {
   HaveCopy(const HaveCopy&)  = default;
   HaveCopy(HaveCopy&&)       = delete;
   HaveCopy& operator= (const HaveCopy&)  = default;
   HaveCopy& operator= (HaveCopy&&)       = delete;
};
Run Code Online (Sandbox Code Playgroud)

没有简单的测试:

static_assert(std::CopyConstructible<HaveCopy>);
Run Code Online (Sandbox Code Playgroud)

而它通过了旧的:

static_assert(std::is_copy_constructible<HaveCopy>::value);
Run Code Online (Sandbox Code Playgroud)

那么,问题是为什么呢?标准委员会对此事的意图是什么?HaveCopy不是可构造的,但在我看来几乎是可复制的,并且std::is_copy_constructible<>与我一致.

Copyable概念也继承了相同的行为,即:

template <class T>
concept Copyable …
Run Code Online (Sandbox Code Playgroud)

c++ c++-concepts c++20

10
推荐指数
1
解决办法
274
查看次数

标签 统计

c++ ×1

c++-concepts ×1

c++20 ×1