Ich habe eine Reihe von Funktionen, wo ich Template-Spezialisierung verwenden, um Transformationen auf bestimmte Werte durchzuführen. Bei vielen Typen möchte ich die Werte jedoch unverändert weitergeben.Perfekte Weiterleitung von Rückgabewerten, undefiniertes Verhalten?
template< typename arg >
arg&& convert(arg&& x)
{
return std::forward<arg>(x);
}
Dies scheint groß, aber nach der Antwort here es Gefahr läuft, verlässt eine baumelnde Referenz in einer Aussage wie:
Um einen Wert unverändert Ich habe so etwas wie die folgende Funktion als Standard übergeben:
Wenn ich diese Inline nur in Funktionsargumenten verwende, wird dieses Risiko vermieden?
Zum Beispiel habe ich in undefiniertes Verhalten führen, wenn ich etwas tun wie ...
void foo(int&& x)
{
// Do something with x...
}
foo(convert(5));
Einige Kontexte ... wie warum können Sie nicht einfach '5' übergeben oder' std :: move() 'verwenden – StoryTeller
Angenommen, ich wollte einen Wrapper für Funktionen schreiben, die den meisten Typen nichts anhaben, aber zu einem hinzufügen alle Integer aus irgendeinem Grund (das ist nicht mein Anwendungsfall, aber sagen wir mal), dann könnte ich convert für alle Argumente verwenden, unabhängig vom Typ (z. B. in einer Variadic-Funktion), und schreibe eine ganzzahlige Spezialisierung für die konvertiere (x) Vorlage, die zu jeder Ganzzahl eins addiert. – Matt
Ihr Weiterleitungscode ist falsch, es sollte 'std :: forward (x);' sein. –
VTT