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?
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
Nie widzę powodu, dla którego kiedykolwiek napiszesz 'std :: ref (a)
Columbo
@ 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