2015-09-02 10 views
9

ponieważ C++ 14 (N3657) Państwa szablonów funkcyjnych find, count, lower_bound, upper_bound i equal_range z kontenerów asocjacyjnych wspierać porównania niejednorodną odnośnika ale at i operator[] nie mają te równoważne szablony funkcji składowej. Dlaczego to jest takie ?Dlaczego heterogeniczne wyszukiwanie porównawcze nie jest zaimplementowane dla `at` i` operator [] `?

Przykład:

std::map<std::string, int, std::less<>> m; 
// ... 
auto it = m.find("foo"); // does not construct an std::string 
auto& v = m.at("foo"); // construct an std::string 
+6

Prawdopodobnie zapomnieli. – Shoe

+0

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

+5

'[]' 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'. –

Odpowiedz

5

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 ywtedy 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).

+0

'map :: operator [] (typ_klucza)' nigdy nie jest 'const'em –

+0

@PiotrSkotnicki: nie moja wina ... – 6502

+0

Nie sądzę, aby twój trzeci punkt był zgodny z innymi funkcjami wyszukiwania. Użytkownik może łatwo utworzyć tymczasowy, jeśli to konieczne. Ale może to być wymagane dla kompatybilności wstecznej. – dyp

Powiązane problemy