C++ 我可以从向量的开头移动对象吗?为什么不呢?

C++ 我可以从向量的开头移动对象吗?为什么不呢?,c++,move-semantics,C++,Move Semantics,不编译。为什么? #include <iostream> #include <vector> struct test_s { int a; test_s& operator=(test_s &&ts) { a = ts.a; ts.a = 0; return *this; } }; int main () { std::vector<test_s> v;

不编译。为什么?

#include <iostream>
#include <vector>

struct test_s {
    int a;

    test_s& operator=(test_s &&ts) {
        a = ts.a;
        ts.a = 0;
        return *this;
    }
};

int main ()
{
  std::vector<test_s> v;

  test_s ss = std::move(v.front());

  return 0;
}
是否可以在不调用复制赋值运算符的情况下从矢量移动对象

这是不可编译的。为什么?

#include <iostream>
#include <vector>

struct test_s {
    int a;

    test_s& operator=(test_s &&ts) {
        a = ts.a;
        ts.a = 0;
        return *this;
    }
};

int main ()
{
  std::vector<test_s> v;

  test_s ss = std::move(v.front());

  return 0;
}
因为您的结构测试需要移动构造函数或复制构造函数

声明:

test_s ss = std::move(v.front());
构造对象ss。虽然您看到了=符号,但这不是赋值

但是,您已经在结构中定义了移动分配

根据,当用户定义移动赋值时,编译器不提供移动构造函数。此外,move操作应该回退到copy上,但是正如您在表中看到的,copy构造函数也被隐式删除,正如您的编译器所建议的那样

是否可以在不调用复制赋值运算符的情况下从矢量移动对象

嗯,是的

您应该为类定义自己的移动构造函数。 事实上,你应该遵守规则

注: 还要注意,正如一些注释所指出的,当您试图访问向量中不存在的元素时,代码有一个未定义的行为

这是不可编译的。为什么?

#include <iostream>
#include <vector>

struct test_s {
    int a;

    test_s& operator=(test_s &&ts) {
        a = ts.a;
        ts.a = 0;
        return *this;
    }
};

int main ()
{
  std::vector<test_s> v;

  test_s ss = std::move(v.front());

  return 0;
}
因为您的结构测试需要移动构造函数或复制构造函数

声明:

test_s ss = std::move(v.front());
构造对象ss。虽然您看到了=符号,但这不是赋值

但是,您已经在结构中定义了移动分配

根据,当用户定义移动赋值时,编译器不提供移动构造函数。此外,move操作应该回退到copy上,但是正如您在表中看到的,copy构造函数也被隐式删除,正如您的编译器所建议的那样

是否可以在不调用复制赋值运算符的情况下从矢量移动对象

嗯,是的

您应该为类定义自己的移动构造函数。 事实上,你应该遵守规则

注:
还要注意,当您试图访问向量中不存在的元素时,代码有一个未定义的行为,正如一些注释所指出的。

您调用的是移动构造函数,而不是移动赋值运算符。您实际想要实现什么?你想从向量中删除第一个元素吗?顺便说一句,你的代码有UB,因为没有可以移动的v锋,向量有零个元素,就像a一样。还要注意的是,通常移动要比复制更有效,但在您的示例中,简单的复制可能更有效cheaper@formerlyknownas_463035818这样问很难。如果OP放入大量代码,他将被要求创建最小的示例。如果OP提供了最低限度的服务,您会抱怨没有理由搬家。OP不必创建需要移动的示例。您正在调用移动构造函数,而不是移动赋值运算符。您实际想要实现什么?你想从向量中删除第一个元素吗?顺便说一句,你的代码有UB,因为没有可以移动的v锋,向量有零个元素,就像a一样。还要注意的是,通常移动要比复制更有效,但在您的示例中,简单的复制可能更有效cheaper@formerlyknownas_463035818这样问很难。如果OP放入大量代码,他将被要求创建最小的示例。如果OP提供了最低限度的服务,您会抱怨没有理由搬家。OP不必创建需要移动的示例。