我在尝试 move std::vector<T>
时遇到崩溃其中 T
显然是不可 move 的(没有定义 move 构造函数/赋值运算符,它包含内部指针)
但为什么 vector 的 move 函数要调用 T
的 move 函数? ?应该没有必要。
所以我的问题来自标题:是 std::vector<T>
如果 T
可 move 不可 move ?
最佳答案
是的,
std::vector<T>
即使T
也是可 move 的不可 move 。左侧仅从右侧的 vector 中获取所有权,不涉及任何元素。 (除了一个异常(exception),在#2 中列出)vector
的 move 分配只会调用T
的 move 构造函数或 move 赋值如果 和它们的分配器比较相等并且左侧分配器的propagate_on_container_move_assignment
是false
. (请注意,如果您的 move 构造函数可能会抛出异常或不存在,则将使用复制构造函数代替)但是,您不太可能遇到其中任何一个。改写:如果
propagate_on_container_move_assignment
是true
(通常是),然后是vector
始终是可 move 的,并且不会触及单个元素。如果是false
,但分配器比较相等, vector 将在不接触单个元素的情况下 move 。如果它为 false 并且分配器比较不相等,则单个元素将被转移。如果存在 nothrow move 分配,则使用它。否则,如果存在复制构造函数,则使用它。否则使用 throw Action 分配。如果它既不可 move 也不可复制,那么这是未定义的行为。- 没有定义 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/