2016-08-18 14 views
7

RozważmyCzy konstruktor z szablonem może zastąpić konstruktora skasowanych kopii?

template<typename T> 
struct Foo 
{ 
    Foo(const Foo&) = delete; 
    template <typename Y> 
    Foo(const Foo<Y>&){} 
}; 

Czy właściwe instancji konstruktora szablonów stanąć do konstruktora kopii? Wiem, że to normalnie (ponieważ konstruktor kopiowania nie może być funkcją szablonu), ale tutaj usunąłem konstruktora kopiowania.

+4

'Foo (const T &)' nie jest konstruktor kopiujący. 'Foo (const Foo &) 'byłoby. – aschepler

+0

Przepraszam, myślę, że miałem składnię szablonu błędny. Czy teraz jest lepiej? –

+1

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. –

Odpowiedz

3

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ć

  1. Foo<int> bar(double_foo); jest dozwolone ze względu do szablonu
  2. Foo<int> bar(int_foo); jest niedozwolone ze względu na konstruktora delete d
  3. 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).

+0

Bardzo dziękuję, ale czy myślisz, że mógłbyś wyjaśnić swoją ostatnią nutę? –

+1

Google "Najbardziej Vexing Parse". – Bathsheba

4

Problem polega na tym, że usunięte funkcje nadal uczestniczą w przeciążeniu. Tak więc biorąc pod uwagę

Foo<int> a; 
Foo<int> b{a}; 

żywotne funkcje zostały usunięte konstruktor kopiujący i konstruktor szablonu z wyprowadzoną szablonu argumentu int. Będąc nie szablonem, wygrywa konstruktor kasowanej kopii. A użycie usuniętej funkcji powoduje, że program jest źle sformułowany.

Zatem nie, konstruktor szablonu nie może być kiedykolwiek utworzony jako konstruktor kopii do kopiowania obiektu tego samego typu.

Powiązane problemy