Nie ma powodów logicznych w zasadzie do niego. Na przykład dla operator[]
rozsądny semantyczny może być
- Jeśli minęło wartość jest porównywalna z
key_type
zrobić wyszukiwanie używania i konwertować do key_type
tylko w razie potrzeby (czyli jeśli element nie zostanie znaleziony, a pojemnik jest ani const ani dostęp za pomocą odniesienia const).
- Jeżeli w przypadku przed przechodzi typu nie można przekształcić
key_type
stosowanie operator[]
nie powinny kompilacji (jak to się dzieje obecnie)
- Jeśli przekazany typu nie mogą być porównywane z
key_type
ale może być przekształcony key_type
potem tymczasowy powinien zostać utworzony natychmiast, aby wykonać wyszukiwanie i ewentualnie wstawienie (jak teraz).
Oczywiście powinien istnieć wymóg posiadania x < y
dla T
elementu x
i key_type
elementem y
wtedy i tylko wtedy, gdykey_type(x) < y
bo inaczej semantyczne byłby nonsens (jak byłoby nonsensem na przykład mieć operator<
aby zwrócić wartość opartą na losowym źródle).
Niestety, szablon maszyn C++ jest jednocześnie niezwykle złożony i bardzo słaby, a implementacja konwersji na key_type
dla operator[]
jest tylko wtedy, gdy naprawdę konieczna jest prawdopodobnie bardziej skomplikowana, niż się wydaje.
Ta maszyna jest jednak tym, co społeczność C++ zdecydowała się skazać na używanie do metaprogramowania i dopóki ktoś nie wykona przyzwoitej implementacji używając tylko tego, to rozsądne wymaganie prawdopodobnie nie będzie zgodne ze standardem (w przeszłości zdarzało się, że standard nakazał rzeczy, które zostały niejasno zdefiniowane i/lub zasadniczo niemożliwe do zrealizowania jak eksport szablonu, i nie było to śmieszne).
Prawdopodobnie zapomnieli. – Shoe
The [proposal] (http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3465.pdf) wspomina tylko o funkcjach, które wymieniasz, i nie podaje żadnego powodu do wykluczenia inni (nie pewni, że taki będzie). Możesz po prostu wysłać Joaquina i powiedzieć mu, żeby to naprawił. – Barry
'[]' jest trudne, ponieważ może wstawić, i nie ma żadnej gwarancji, że to, co jest podnoszone, może być użyte do skonstruowania 'key_type'. –