Почему в тексте есть требование "не шаблон"?
Учитывая, что оно отличается, и конструкторы копирования могут быть шаблонами.Как конструктор без копирования не может быть неоднозначным при наличии шаблона конструктора копирования?Учтите это:
struct Foo {
// ctor template: clearly useful and necessary
template <typename T>
Foo(const T&) {}
// copy ctor: same signature! can't work
template <typename T>
Foo(const T &) {}
};
Кроме того, построение Foo
из объекта, который не является Foo
, может быть достигнуто либо преобразованием, либо обычным построением, но с учетом возможности копирования из не- Foo
объект меняет понятие копирование на копирование, включая преобразование .Но это уже может быть реализовано с помощью существующей схемы (преобразование или создание без копирования).
В этом примере здесь будет напечатано.Таким образом, кажется, что мой конструктор шаблона является конструктором копирования
Пример, который вы показываете, не вызывает конструкцию копирования, а является обычной неявной конструкцией.Если вы измените шаблон конструктора на
template <typename T>
Foo(const T &) {
// ^^^^^
printf("here\n");
}
, то Foo b = a;
приведет к вызову созданного компилятором конструктора копирования.Обратите внимание, что копия ctor, сгенерированная компилятором, имеет следующую подпись:
Foo(const Foo&);
Это требует добавления const
-калифатора к a
в Foo b = a;
.Оригинальный шаблон конструктора Foo(T&)
в вашем фрагменте лучше подходит, так как не добавлен const
-кавалификатор.