Как шаблон влияет на неявно-объявленные правила в C ++? - PullRequest
0 голосов
/ 01 октября 2018

Пример:

template<class T> class A{
  public:
    A(){}
    template<class U> A(A<U> &){}
  private:
    template<class U> A(A<U>&&){}
};

int main() {
  A<int> a1;// legal
  A<int> a2(std::move(a1));//legal. it calls implicitly-declared constructor.
}

но когда я удаляю A () {}:

template<class T> class A{
  public:

    template<class U> A(A<U> &){}
  private:
    template<class U> A(A<U>&&){}
};

int main() {
  A<int> a1;// illegal. 3
  A<int> a2(std::move(a1));
}

  • Если конструкторы шаблона не влияют на неявно-объявленныйправила.почему он становится недопустимым?
  • Если конструкторы шаблонов влияют на неявно объявленные правила, почему в первом примере A<int> a2(std::move(a1)); недопустимо?

Протестировано в gcc и clangна убунту.

1 Ответ

0 голосов
/ 01 октября 2018

In

template<class T> class A{
  public:
    A(){} // A
    template<class U> A(A<U> &){} // B
  private:
    template<class U> A(A<U>&&){} // C
};

int main() {
  A<int> a1; // 1
  A<int> a2(std::move(a1)); // 2
}

line 1 вызывает конструктор A.Однако строка 2 не вызывает конструктор A, B или C.Так как ваш класс не объявляет конструктор копирования (B не является конструктором копирования, потому что это шаблон), компилятор создает конструктор перемещения по умолчанию (C не является конструктором перемещения, потому что это шаблон), и этоконструктор перемещения по умолчанию, который используется в строке 2.

Во втором примере наличие B и C не позволяет компилятору генерировать конструктор по умолчанию, поэтому строка 1 больше не компилируется, но еслиэто так, строка 2 все равно будет компилироваться, поскольку будет использовать сгенерированный компилятором конструктор перемещения.


Итак, правило, которое вызывает вас, - это конструктор копирования или перемещения, а не конструктор шаблона., но шаблоны конструктора по-прежнему считаются конструкторами, поэтому они отключают конструктор по умолчанию.Это означает, что вам нужно игнорировать их при проверке, чтобы увидеть, будет ли в вашем классе сгенерирован конструктор копирования или перемещения по умолчанию.Правила получения: см. Условия автоматической генерации ctor по умолчанию / копирования / перемещения и оператора назначения копирования / перемещения?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...