Dalsze odniesienia, pewne konkretne odniesienia do normy to:
13.3.3 Najlepszy opłacalne funkcja
Biorąc pod uwagę te definicje, realną funkcję F1 definiuje się jako lepszą funkcję niż inna żywotna funkcja F2, jeśli dla wszystkich argumentów i, ICSi (F1) nie jest gorszą sekwencją konwersji niż ICSi (F2), a następnie. ..
- F1 nie jest specjalizacja szablonu funkcja i F2 jest specjalizacja szablonu funkcja ...
W tym przypadku funkcja zakaz matrycy jest (oczywiście) nie jest szablon funkcja specjalizacja i konwersja "Hello World"
na char const*
nie jest gorszy niż do const char[N]
, zgodnie z regułami rankingu zdefiniowanymi w Tabeli w sekcji "Standardowe sekwencje konwersji". Zgodnie z tą tabelą zarówno No conversions required
, jak i Array-to-pointer conversion
są uważane za dokładne dopasowanie w kontekście rozdzielczości przeciążania. Podobnie, jeśli szablony przeciążenia zostaną zmienione na przeciążenie bez szablonu (to jest jako void assign(const T(&ptr)[12]);
), kompilacja str.assign("Hello World");
zakończy się niepowodzeniem z powodu niejednoznacznego wywołania.
Aby upewnić się, że funkcja nie szablon nie jest uważane za przeciążenie, istnieje następujący zapis w sekcji „specyfikacja szablon argumentem Explicit”:
Uwaga: lista pusty szablon argument może być używany wskazanie, że dane użycie odnosi się do specjalizacji szablonu funkcji, nawet jeśli widoczna jest funkcja inna niż szablonowa (8.3.5), która w innym przypadku byłaby użyta.
Do tego można użyć str.assign<>("Hello World");
.
Interesujące, nie spodziewałem się tego. Zrobiłem nieco bardziej złożony przykład tutaj: http://cpp.sh/7hnfk, który zgadza się z twierdzeniem Microsoft, że auto s = "rzecz"; spowoduje domyślnie const char * (https://msdn.microsoft.com/en-us/library/69ze775t.aspx). – Arunas