Возьмите следующий,заставляя Шаблонный конструктор над компилятором копиеем конструктора
template<class T>
struct Foo {
Foo(){}
// a template constructor "generalized" over related types
template<class U>
Foo(Foo<U> const&) {
std::cout << 1;
}
// copy constructor
Foo(Foo const&) {
std::cout << 2;
}
};
и его пользователь:
void main() {
Foo<int> f1;
Foo<const int> f2(f1); // prints 1
Foo<const int> f3(f2); // prints 2
}
Даже без явного копирующего конструктора, компилятор генерирует один и использует для f3(f2)
.
Есть ли способ заставить шаблон перегружать? Например, может ли конструктор копирования быть SFINAE'd? Это делается для того, чтобы избежать дублирования кода, поскольку, как ни удивительно, не представляется возможным использовать делегирующие конструкторы (делегирование от конструктора копирования к шаблону).
Неа, это не то же самое, и это делает 'f3 (f2)' ошибка, так как разрешение перегрузки по-прежнему выбирает конструктор копирования и ошибок, как 'delete'd. (комментарий, на который я ответил, спрашивал, есть ли опция 'delete') – sly