gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:14:21 27 4
gpt4 key购买 nike

我在尝试 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/

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