2013-10-18 7 views
6

Ich habe eine Methode, die Speicher für ein Objekt reserviert und ruft dann seinen Konstruktor - ein Speicherzuordner.Mischen von Pass-by-Reference und Pass-by-Value zur variablen Template-Funktion gültig?

Ist es mit dieser Funktion zulässig, Pass-by-Value und Pass-by-Reference zu mischen? Zum Beispiel das Zuweisen einer Klasse zu einem Konstruktor mit einem By-Wert und einem By-Reference. Es kompiliert, aber ich bin nicht sicher, ob es irgendwelche fiesen Nebenwirkungen hat oder nicht.

+1

Sie sollten wahrscheinlich verwenden 'T (std :: Vorwärts (args) .. .), aber abgesehen davon sollte es dir gut gehen. – nijansen

Antwort

5

Was Sie suchen, ist perfekte Weiterleitung, dh. Ihre AllocateObject Funktion sollte vollständig transparent sein, soweit es um das Kopieren von Nebenwirkungen geht. (Wie nijansen bereits erwähnt) und die Verwendung von universal Referenzen

Diese beiden std::forward beinhaltet in Ihrer Parameterliste:

template <class T, typename... Arguments> 
inline T* AllocateObject(Arguments&&... args) 
//        ^^ universal references 
{ 
    return new (InternalAllocate(sizeof(T))) T(std::forward<Arguments>(args)...); 
    //           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ forwarding 
} 
+0

Ja, ich habe tatsächlich '&&' vergessen, das ist wichtig für eine perfekte Weiterleitung;) – nijansen

+0

Nebenbemerkung: Universalreferenzen wurden inzwischen in "Weiterleitende Referenzen" umbenannt. –