【问题标题】:Will C++ use a move constructor from a copy assignment operator?C++ 会使用来自复制赋值运算符的移动构造函数吗?
【发布时间】:2012-02-23 16:44:34
【问题描述】:

假设我有一个简单的结构,它包含一个向量并定义了一个复制赋值运算符,以及一个返回该结构的函数,如下所示:

struct SimpleStruct
{
    vector< int > vec1;

    operator=( SimpleStruct& other )
    {
         vec1 = other.vec1;
    }
}

SimpleStruct GetStruct();

据我了解,因为我声明了复制赋值运算符,编译器不会自动为 SimpleStruct 生成移动构造函数。

所以如果我像这样使用GetStruct 函数:

SimpleStruct value = GetStruct();

当我说vec1 = other.vec1; 时,编译器是否足够聪明,可以移动而不是复制向量?或者我是否需要为 SimpleStruct 显式定义移动构造函数/赋值运算符以利用向量移动?

【问题讨论】:

  • otherconst 时,它不能移动任何东西。
  • @BoPersson 啊,没想到。为了这个问题,删除了 const。
  • 澄清一下,编译器在任何情况下都不会自动生成移动构造函数或赋值运算符。如果需要移动语义,它们总是必须由开发人员提供。
  • @dauphic 你确定吗?这个问题似乎不同意:stackoverflow.com/questions/8283589/…
  • 我可能是错的,我不会和 litb 争论,但我只是测试过,没有提供 POD。

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


【解决方案1】:

C++11 对何时允许移动有非常严格的规定。除非涉及临时,否则这些规则需要明确使用 std::move 或类似的转换(例如 std::forward 在某些情况下)。

是的,你可以移动一些东西。但这不会偶然发生。这必须是经过深思熟虑的。

另外,编写一个可以修改正在复制的内容的复制赋值运算符通常是不礼貌的。这就是为什么他们通常会使用const&amp;,这几乎可以保证无法移动。

或者我是否需要为 SimpleStruct 显式定义移动构造函数/赋值运算符以利用向量移动?

一般来说,这就是您显式定义复制和移动构造函数的原因。让编译器完成它的工作并为你生成那些(除非你使用的 VC++ 不能为移动构造函数/赋值完成它的工作)。只为低级容器显式编写复制/移动构造函数;任何更大的东西都应该依赖这些值类型来完成他们的工作。

【讨论】:

    【解决方案2】:

    在复制构造函数或复制赋值运算符中,复制表示复制。该语言从不根据函数的调用方式对函数的内容进行任何上下文调整。

    但是,SimpleStruct value = GetStruct(); 中很可能不会出现任何副本,因为 copy elision 适用。

    【讨论】:

      猜你喜欢
      • 2016-05-19
      • 2013-09-28
      • 1970-01-01
      • 1970-01-01
      • 2019-09-29
      • 2017-01-16
      • 2012-03-01
      • 1970-01-01
      • 2020-06-13
      相关资源
      最近更新 更多