Вот определение конструктора копирования, [class.copy.ctor/1]:
Нетаблетный конструктор для класса X является конструктором копирования, если его первый параметр имеет тип X &, const X &, volatile X & или const volatile X &, и либо нет других параметров, либо все остальные параметры имеют аргументы по умолчанию ([dcl. fct.default]).
Почему стандарт исключает шаблоны как конструкторы копирования?
В этом простом примере оба конструктора являются конструкторами копирования:
struct Foo {
Foo(const Foo &); // copy constructor
Foo(Foo &); // copy constructor
};
Посмотрите этот похожий пример:
struct Foo {
Foo() = default;
template <typename T>
Foo(T &) {
printf("here\n");
}
};
int main() {
Foo a;
Foo b = a;
}
В этом примере here
будет напечатано. Таким образом, кажется, что мой конструктор шаблона является конструктором копирования, по крайней мере, он ведет себя как единица (он вызывается в контексте, где обычно вызываются конструкторы копирования).
Почему в тексте есть требование "не шаблон"?