2015-05-15 12 views
24

rozpatrywanymi w ocenie środków this question, co jest o następującym kodzie nie dotyczy opracowanie:Gdyby operatorzy być zadeklarowane jako nieczłonkowskimi przyjaciół spoza szablonu

std::vector<int> a, b; 
std::cout << (std::ref(a) < std::ref(b)); 

To nie kompiluje ponieważ wektor comparison operators dla vector są funkcją non-member szablony i niejawne konwersje nie mogą być brane pod uwagę. Jednakże, jeśli operatorzy zostali zamiast zapisać jako niebędącego państwem członkowskim spoza szablonu, friend funkcje:

template <class T, class Allocator = std::allocator<T>> 
class vector { 
    // ... 

    friend bool operator<(const vector& lhs, const vector& rhs) { 
     // impl details 
    } 
}; 

Potem ta wersja operator< zostałby znaleziony przez ADL i został wybrany jako najlepszy realną przeciążenia, a oryginalny przykład skompilowałbym. Biorąc pod uwagę to, czy istnieje powód, aby wolał szablon funkcji non-member, który mamy obecnie, czy powinno to być uznane za wadę w standardzie?

+0

Są podobne problemy z 'operatorem <<' i strumieniami w kilku miejscach: co powoduje, że coś się dzieje. Mogę napisać operator 'template << (std :: basic_ostream &, std :: basic_string &)' * bez * w zależności od więcej niż deklaracji forward (jednego z dwóch). "Operator Koenig" wymagałby co najmniej jednego z nich (co?), Czy wymaga obu? (to jest tangental, ponieważ chodzi o operatory dwusystemowe, a nie takie jak powyższe) – Yakk

+3

Nie widzę powodu, dla którego kiedykolwiek napiszesz 'std :: ref (a) Columbo

+0

@ Columbo Działa dla 'int's. Poza tym nie wiem, dlaczego robiłeś wiele rzeczy - nie oznacza to, że język na to nie pozwala. Ponadto pozwoliłoby to twojemu klasie z 'operator std :: string()' zrobić porównania z rzeczami, z którymi 'string's się porównuje. – Barry

Odpowiedz

1

Biorąc pod uwagę, że istnieje powód, aby preferować non-member function szablon, który mamy obecnie, czy należy to uznać za wadę w normie?

Powód jest taki, że ADL może znaleźć odpowiednią funkcję, czy nie. Gdy takie wyszukiwanie wymaga wyodrębnienia parametrów zastępowanego szablonu z typu danego obiektu, a następnie zastąpienia go wielokrotnie szablonem funkcji szablonu, ADL nie może tego zrobić, ponieważ w ogólnym przypadku nie ma powodów do preferowania jeden sposób wiązania parametrów szablonu z innymi. Szablon funkcji, który nie jest członkiem, zdefiniowany za, ale nadal w zakresie przestrzeni nazw tego szablonu (z powodu friend), wyklucza taką nieokreśloność.

Powiązane problemy