【发布时间】:2020-10-29 18:59:08
【问题描述】:
根据cppreference,std::copyable定义如下:
template <class T>
concept copyable =
std::copy_constructible<T> &&
std::movable<T> && // <-- !!
std::assignable_from<T&, T&> &&
std::assignable_from<T&, const T&> &&
std::assignable_from<T&, const T>;
我想知道为什么可复制对象也应该是可移动的。想想一个由多个函数访问的全局变量。虽然复制该变量是有意义的(例如在调用另一个函数之前保存其状态),但移动它是没有意义的,实际上会非常糟糕,因为其他函数可能不知道该变量当前处于未指定状态.那么为什么std::copyable 包含std::movable 呢?
【问题讨论】:
-
一个有点相关的问题的有趣答案stackoverflow.com/a/14303116/6865932
-
另请参阅原始移动语义提案中的此链接部分:open-std.org/jtc1/sc22/wg21/docs/papers/2002/…
-
移动给定类型的任何对象的技术容量(即使我们错误地将“移动”限制为未实现为副本的移动) 并不意味着移动一个特定的 object 是一个好主意。您可能也可以分配给它;如果不应该这样做,请不要这样做。
标签: c++ copy move-semantics c++20