c++ - 如果 T 不可 move ,则 std::vector<T> 是否可 move ?

标签 c++ c++11 vector move-semantics

我在尝试 move std::vector<T> 时遇到崩溃其中 T显然是不可 move 的(没有定义 move 构造函数/赋值运算符,它包含内部指针)

但为什么 vector 的 move 函数要调用 T 的 move 函数? ?应该没有必要。

所以我的问题来自标题:是 std::vector<T>如果 T 可 move 不可 move ?

最佳答案

  1. 是的,std::vector<T>即使T也是可 move 的不可 move 。左侧仅从右侧的 vector 中获取所有权,不涉及任何元素。 (除了一个异常(exception),在#2 中列出)

  2. vector 的 move 分配只会调用 T 的 move 构造函数或 move 赋值如果 和它们的分配器比较相等并且左侧分配器的 propagate_on_container_move_assignmentfalse . (请注意,如果您的 move 构造函数可能会抛出异常或不存在,则将使用复制构造函数代替)但是,您不太可能遇到其中任何一个。

    改写:如果propagate_on_container_move_assignmenttrue (通常是),然后是 vector始终是可 move 的,并且不会触及单个元素。如果是 false ,但分配器比较相等, vector 将在不接触单个元素的情况下 move 。如果它为 false 并且分配器比较不相等,则单个元素将被转移。如果存在 nothrow move 分配,则使用它。否则,如果存在复制构造函数,则使用它。否则使用 throw Action 分配。如果它既不可 move 也不可复制,那么这是未定义的行为。

  3. 没有定义 move 赋值运算符,并且类包含内部指针,意味着您的类不可 move 。事实上,这听起来像是编译器认为它可 move 的。如果您想禁用 move ,请使用 T(T&&) = delete;T& operator=(T&&) =delete ,但我不建议这样做。相反,添加一个正确工作的 move 构造函数并 move 赋值。它们往往很简单,而且非常有用。

关于c++ - 如果 T 不可 move ,则 std::vector<T> 是否可 move ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22995550/

相关文章:

c++ - 从赋值运算符调用析构函数有什么意想不到的后果吗?

c++ - 组合函数、绑定(bind)、C++ 和托管代码

r - 如何在R中对 'paired'向量进行排序

c++ - 我如何优化这个 dijkstra 结构代码?

c++ - Clang 只有 : A pair<path, path> 可以被放置到一个 vector 中;一对 <unique_ptr, unique_ptr> 也可以;但不是对 <path, unique_ptr> : Why?

c++ - 设置一个 std::function 变量来引用 std::sin 函数

c++ - 修改vector的元素(按值,按引用)函数C++

c++ - 如何将字符串转换为 vector

c++ - 在不包含 windows.h 的情况下调用 kernel32.dll 函数

c++ - 在哪里声明枚举