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不必创建需要移动的示例。