c++ - C++ 会使用复制赋值运算符中的 move 构造函数吗?

标签 c++ c++11 rvalue-reference move-semantics

假设我有一个简单的结构,其中包含一个 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/

相关文章:

c++ - 允许使用右值捕获但不分配给的运算符重载

c++ - C++中的顺序随机数?

python - 如何将变量值从 C++ 传递给 Python?

c++ - 如何只读取 ifstream 中的字符并忽略 C++ 中的数字?

c++ - 为什么迭代器在容器调用分配时不能引用它们所属的容器?

c++ - 可以使用 using 为数组键入别名吗?

c++ - 命名右值引用的类型是什么?

c++ - 在 C++ 中以字节序列存储整数值

c++ - 如何正确设计和实现函数模板特化?

c++ - 通过 std::bind 传递右值