Ich bin gespannt, ob Sie T & & (universelle Referenz) anstelle der klassischen T const & (l-Wert-Referenz) für Templates Funktionsparameter beginnend mit C verwenden ++ 11. Was mich besonders interessiert, ist, wie Sie die Tatsache umgehen, dass Sie gezwungen sind, das const zu verlieren, wenn Sie auch r-Wert-Referenzen behandeln wollen; Gibt es einen Weg dahin?Ob T const & oder T && verwenden
Antwort
Es gibt kein Problem mit "Verlieren der Const". T
wird mit cv-Qualifiern abgeleitet, wenn das Argument cv-qualifiziert ist. Wenn das Argument beispielsweise ein R-Wert des Typs const std::string
ist, wird T
als const std::string
abgeleitet. Sie können die const-Korrektheit möglicherweise nicht durch Verwendung von Weiterleitungsreferenzen verletzen. Wenn Sie könnten, wäre das ein großer Sprachfehler.
Was die weiter gehende Frage, wenn die Umleitung Referenzen verwendet werden sollen, finden Sie hier: Proper use of universal references
Ich hatte den Eindruck, dass Sie T const verwendet haben und * garantieren * Ihre Funktion würde die Variable nicht verändern. Was passiert, wenn der Benutzer Ihnen keine konstante I-Wert-Referenz übergibt, aber nicht möchte, dass Sie ihn ändern? Nur stellen Sie sicher, dass Sie nicht? – Salgat
@Salgat Wenn du eine Funktion schreiben willst, die niemals ihr Argument ändert, dann solltest du besser bei 'T const &' bleiben. Weiterleitungsreferenzen sind nützlich, wenn Sie den übergebenen Wert oder etwas Ähnliches verschieben möchten. – Brian
Diese Frage ist ziemlich marginal, da Sie eine Meinung sind gefragt, aber die technische Bit zu beantworten, nicht wahr löse die const. Deshalb nennt man das eine universelle Referenz.
Sie sind nicht gezwungen zu verlieren const: template<typename T> void fun(T &&val)
könnte nicht-const lvalues, const l-Werte und rvalues binden. Sie dürfen immer noch template<typename T> void fun(const T &v)
tun, was eine spezialisiertere Überladung für const-Referenzen sein wird, daher werden nicht modifizierbare l-Werte diese Überlastung treffen.
Die erste Überladung mit der 'Vorwärtsreferenz' wird an änderbare Werte und R-Werte gebunden. Wenn ich einen Prototyp einer Template-Funktion mit einer Weiterleitungsreferenz lese (was S. Meyers als "universelle Referenz" getauft hat), sagt mir das, dass die Funktion die Bewegungssemantik ausnutzen könnte, nicht mehr.
Es ist möglich, die Konstanz des Arguments intern zu erkennen; Da Sie jedoch fragen, ob dies der empfohlene allgemeine Weg ist, würde ich sagen, dass die Verwaltung des nicht veränderbaren l-Wertes in seiner eigenen Überladung empfohlen wird, außer wenn dies nicht praktikabel ist (z. B. wenn mehrere Parameter behandelt werden, die const sein können oder nicht)
Ich bin mir nicht sicher, was Sie fragen; Kannst du ein Beispiel geben? –
Wie erzwinge ich Const für alle Referenzen, auch wenn ich nicht eine Const L-Wert-Referenz übergeben? Es scheint, als ob die Verwendung von T && das Risiko eingeht, dass const verloren geht, wenn der Benutzer keine const-Referenz darauf gibt. – Salgat
Sie wollen also eine Funktion, die einen rvalue vom Typ T als T &&, const lvalue als const T & und (non-const) lvalue auch als const T & num; Ist das was du sagst? Die Absicht Ihrer Frage ist wirklich schwer, gut, abzuleiten. –