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 по умолчанию / копирования / перемещения и оператора назначения копирования / перемещения?