假设我有一个简单的结构,其中包含一个 vector 并定义了一个复制赋值运算符,以及一个返回该结构的函数,如下所示:
struct SimpleStruct
{
vector< int > vec1;
operator=( SimpleStruct& other )
{
vec1 = other.vec1;
}
}
SimpleStruct GetStruct();
据我了解,因为我已经声明了一个复制赋值运算符,所以编译器不会自动为 SimpleStruct 生成 move 构造函数。
所以如果我像这样使用 GetStruct
函数:
SimpleStruct value = GetStruct();
当我说 vec1 = other.vec1;
时,编译器是否足够智能以 move 而不是复制 vector ?或者我是否需要为 SimpleStruct 显式定义 move 构造函数/赋值运算符以利用 vector move ?
最佳答案
C++11 对何时允许 move 有非常严格的规定。除非涉及临时,否则这些规则需要显式使用 std::move
或类似的转换(例如在某些情况下为 std::forward
)。
是的,您可以 move 一些东西。但这不会偶然发生;这必须是经过深思熟虑的。
此外,编写可以修改正在复制的内容的复制赋值运算符通常是粗鲁的。这就是为什么他们通常采用 const&
,这几乎可以保证无法 move 。
Or will I need to explicitly define a move constructor/assignment operator for SimpleStruct to take advantage of a vector move?
一般来说,这就是您不显式定义复制和 move 构造函数的原因。让编译器完成它的工作并为你生成那些(除非你使用的是 VC++,它不会为 move 构造函数/赋值完成它的工作)。只为低级容器显式编写复制/move 构造函数;任何更大的东西都应该只依赖于这些值类型来完成它们的工作。
关于c++ - C++ 会使用复制赋值运算符中的 move 构造函数吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9417308/