为什么在删除了“移动构造函数”时使用了“复制构造函数”?

sun*_*369 2 c++ constructor copy-constructor move-semantics c++11

作为主题,相关代码为:

#include <iostream>     

class ABC     
{  public:  
    ABC() 
    {
        std::cout<< "default construction" << std::endl;
    }

    ABC(const ABC& a) 
    {
        std::cout << "copy construction" << std::endl;
    } 

    ABC(const ABC&& a) 
    {
        std::cout << "move construction" << std::endl;
    }
};                         

int main()   
{  
   ABC c1 = ABC();  

   return 0;  
}
Run Code Online (Sandbox Code Playgroud)

使用 -fno-elide-constructors -std=c++11 输出

default construction
move construction
Run Code Online (Sandbox Code Playgroud)

如果我删除上面的移动构造函数,则输出为:

default construction
copy construction
Run Code Online (Sandbox Code Playgroud)

为什么copy construction可以用whilemove constructor已经去掉了?你看,如果有用户定义的move constructor,编译器更喜欢使用move constructor

根据一些文档,编译器提供了一个默认值move constructor。**那么为什么编译器不使用默认值move constructor呢?我是 C++ 的新手。如果能在这个问题上得到一些帮助,我将不胜感激。

JaM*_*MiT 5

根据一些文档,编译器提供了一个默认的move constructor.

让我们来看看一些文档。以下来自cppreference.com

如果[conditions]则编译器将使用签名将移动构造函数声明为其类的非显式内联公共成员T::T(T&&)

你是对的。编译器确实在正确的条件下提供了默认的移动构造函数。但是,这些条件很重要。您似乎知道的第一个条件:不能有用户定义的移动构造函数。所以只剩下这个条件列表:

  • 没有用户声明的复制构造函数;
  • 没有用户声明的复制赋值运算符;
  • 没有用户声明的移动赋值运算符;
  • 没有用户声明的析构函数;

你去吧。您的用户定义的复制构造函数阻止编译器提供默认的移动构造函数。因此没有可以使用的移动构造函数。