Nie, to nie może: rozdzielczość przeciążenie zawsze uważa funkcji non-matrycy pierwszy, a kiedy jeden delete
d napotkano, rozdzielczość przeciążenie nie zamiast przeciążenie szablonu trakcie rozpatrywania.
Pozwól mi przedstawić domyślny konstruktor w klasie z linią
Foo() = default;
Następnie, należy rozważyć dwie zmienne
Foo<double> double_foo;
Foo<int> int_foo;
Potem pamiętać
Foo<int> bar(double_foo);
jest dozwolone ze względu do szablonu
Foo<int> bar(int_foo);
jest niedozwolone ze względu na konstruktora delete
d
Foo<int> bar = Foo<int>();
byłoby wolno gdybyś ponownie wprowadzone konstruktora ruch pisząc Foo(const Foo&&) = default;
. Musisz użyć składni =
tutaj, ponieważ Foo<int> bar(Foo<int>());
jest deklaracją do przodu.
Wreszcie, twoje stwierdzenie "konstruktor kopii nie może być funkcją szablonu" jest nieprawidłowe. Kredyt dla @LightnessRacesInOrbit:
C++ 14 12.8.2 „Konstruktor non-szablon dla klasy X jest kopią konstruktor, jeśli jego pierwszy parametr jest typu X &, const X & lotne X & const lub volatile X & i albo nie istnieją inne parametry lub jeszcze wszystkie inne parametry mają domyślne argumenty (8.3.6).
'Foo (const T &)' nie jest konstruktor kopiujący. 'Foo (const Foo &) 'byłoby. – aschepler
Przepraszam, myślę, że miałem składnię szablonu błędny. Czy teraz jest lepiej? –
Usunięta funkcja jest nadal dostępna dla rozdzielczości przeciążenia. To po prostu błąd, aby spróbować go użyć.Z drugiej strony tworzenie kopii z wszystkich podobnych typów musi być naprawdę niezwykłe, ale nie z tego samego typu. –