Почему конструктор копирования используется, а конструктор перемещения удален? - PullRequest
1 голос
/ 30 мая 2020

В качестве темы соответствующий код:

#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;  
}

Вывод с -fno-elide-constructors -std = c ++ 11

default construction
move construction

Если i удалите конструктор перемещения выше , тогда результат будет:

default construction
copy construction

почему copy construction можно использовать, а move constructor был удален? Видите ли, если существует определенный пользователем move constructor, компилятор предпочитает использовать move constructor.

Согласно некоторой документации, компилятор предоставляет значение по умолчанию move constructor. ** Так почему бы компилятору не использовать значение по умолчанию move constructor ? Я новичок в C ++. Буду признателен за помощь с этим вопросом.

1 Ответ

4 голосов
/ 30 мая 2020

Согласно некоторой документации, компилятор предоставляет по умолчанию move constructor.

Давайте взглянем на некоторую документацию. Следующее взято из cppreference.com .

Если [условия] , то компилятор объявит конструктор перемещения как неявный встроенный publi c член своего класса с подписью T::T(T&&).

Вы правы. Компилятор действительно предоставляет конструктор перемещения по умолчанию при правильных условиях. Однако эти условия важны. Первое условие, о котором вы, кажется, знаете: не может быть определяемого пользователем конструктора перемещения. Таким образом, остается следующий список условий:

  • нет объявленных пользователем конструкторов копирования;
  • нет объявленных пользователем операторов присваивания копии;
  • нет объявленных пользователем операторов присваивания перемещения;
  • нет объявленного пользователем деструктора;

И вот вам go. Пользовательский конструктор копирования не позволяет компилятору предоставить конструктор перемещения по умолчанию. Следовательно, конструктор перемещения не используется.

...