C ++ Primer (5. Aufl.): Ist "16.3 Überladen und Vorlagen" in all seinen "spezialisierteren" Beispielen falsch?
In Abschnitt 16.3 von C ++ Primer (5. Ausgabe) - Überladen und Vorlagen - wird das Verfahren für den Funktionsabgleich in Gegenwart von Instanziierungen von Kandidatenfunktionsvorlagen beschrieben.
Hier finden Sie die Deklaration für die in diesem Abschnitt verwendeten Funktionsvorlagen:
using std::string;
template <class T> string debug_rep(const T &); /* 1 */
template <class T> string debug_rep(T *); /* 2 */
// definitions not relevant for the questions
Erstes Beispielstring s("SO");
debug_rep(&s);
s wird dann gesagt, dass die erzeugten Instanziierungen somit sin
debug_rep(const string *&)
(mitT
gebunden anstring *
)debug_rep(string *)
Q1 Ist es richtig für # 1? Sollte es nicht instanziierendebug_rep(string* const &)
stattdessen
const string *sp = &s;
debug_rep(sp); //string literal type is const char[10]
s wird dann gesagt, dass die erzeugten Instanziierungen somit sin
debug_rep(const string *&)
(mitT
gebunden anconst string *
)debug_rep(const string *)
Damit würden beide instanziierten Kandidaten eine exakte Übereinstimmung liefern, wobei die Auswahl auf der spezialisierteren Vorlage (-> # 2) erfolgt.
Q2.1 Ist es richtig für # 1? Sollte es nicht instanziierendebug_rep(const string* const &)
?
Q2.2 Angenommen, die instanziierte Funktion ist die oben genannte. Können wir bestätigen, dass es sich nicht mehr um eine exakte Übereinstimmung handelt?
Drittes Beispieldebug_rep("SO world!"); //string literal type is const char[10]
s wird dann gesagt, dass die erzeugten Instanziierungen somit sin
debug_rep(const T &)
(mitT
gebunden anchar[10]
)debug_rep(const string *)
Damit würden beide instanziierten Kandidaten eine exakte Übereinstimmung liefern, wobei die Auswahl auf der spezialisierteren Vorlage (-> # 2) erfolgt.
Q3.1 Wird der Typ für @ abgeleiteT
richtig in # 1? Sollte es nicht @ seconst char[10]
stattdessen
Q3.2 Angenommen, der abgeleitete Typ fürT
ist eigentlich die oben genannte, können wir behaupten, dass es keine exakte Übereinstimmung mehr gibt?