gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 16:08:51 26 4
gpt4 key购买 nike

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>;

支持命名的需求声明。鉴于上述定义,类型如下:

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 是可复制的。

讨论here有点相似,但没有回答为什么。为什么我们需要这种行为?这种检查是否排除了有效的可复制构造类型,或者 HaveCopy 根本不是可复制构造的?如果这是真的,我觉得最后一个真的很奇怪。

有什么想法吗?

最佳答案

是的,CopyConstructible这个概念与类型特征完全不同std::is_copy_constructible .您关注的是移动构造函数,但还有许多其他情况需要考虑。你认为这种类型应该是 CopyConstructible 吗?

struct A {
A(A&) = delete;
A(A const&);
};

这个怎么样?

struct B {
explicit B(B const&);
};

重点是,您可以编写无数种构造函数组合。这并不意味着它们都有意义或值得支持。具有复制构造函数但删除移动构造函数的类型根本没有意义。

Concepts 不仅仅是进行句法检查,它还涉及强制执行语义要求以插入有意义的类型 - 最终更容易编码。如果您只是检查 is_copy_constructible ,您允许自己做的就是显式从 const 左值构造您的类型。写作 T x = y; , 即使yconst T , 已经超出了该范围!这可能就是复制构造的字面意思,但它比更广泛的“我可以从 T 构造一个 T”有意义得多 - 这更接近我们在考虑复制时的真实想法。那是什么概念CopyConstructible给我们。

当您浏览图书馆时,还有其他一些概念(在句法和语义上)比直接翻译它们的名称所暗示的要多。 EqualityComparableWith<T,U> 不只是检查我是否可以写 t == u还有u == t , t != u , 和 u != t以及。 StrictTotallyOrdered 不仅检查排序运算符,它检查== .拥有一个有凝聚力的整体很重要。

关于c++ - 为什么 CopyConstructible 类型也必须是 MoveConstructible 类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54552521/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com