如cppreference中所述,类型T为CopyConstructible的要求是它也是MoveConstructible.
STL CopyConstructible概念的草案包含:
Run Code Online (Sandbox Code Playgroud)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;
};
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概念也继承了相同的行为,即:
Run Code Online (Sandbox Code Playgroud)template <class T> concept Copyable …