Ich habe keine Lösung zu deinem ursprünglichen Problem; ich weiß nur, wie man die Warnung wegkriegt.
Schrompf hat geschrieben:Wie rvalue reference? Ich möchte ja explizit keine Kopie anlegen, sondern die orginale Strukturinstanz verwenden. Oder ich verstehe nicht, was Du meinst. Hast Du Beispielcode zur Syntax-Anschauung?
Wenn ich mich recht irre, ging es um diese Zeile:
Code: Alles auswählen
template <typename Callback> void DoSomething( Container& container , Callback callback);
Dort möchtest du als zweiten Parameter eine Referenz (
Callback &) akzeptieren, damit das Objekt selber manipuliert wird, und nicht eine temporäre Kopie davon. Das geht, solange das übergebene
Callback-Objekt eine benannte, adressierbare Variable ist. Ist es hingegen ein temporäres Objekt – lies: rvalue – ist es nicht mehr portabel, weil Visual C++ zwar das Binden von rvalues an lvalue-Referenzen erlaubt, aber zurecht warnt, dass es nicht standardkonformes Verhalten ist.
Der Sinn dahinter ist: Wenn dort eine nicht-
const-deklarierte Referenz zu einem Objekt steht, dann
wollte der Programmierer, dass nach der Ausführung eine Wirkung im Objekt hinterlassen wird und der Aufruf mit einem temporären Objekt wäre mit hoher Wahrscheinlichkeit Missbrauch der Funktionalität.
Da du temporäre Objekte per rvalue-Referenz erkennen und von dort an auch adressieren kannst, wäre die Lösung, die Funktion für rvalues zu überladen:
Code: Alles auswählen
// Deine jetzige Funktion:
template <typename Callback> void DoSomething( Container& container , Callback & callback);
// Die Überladung für temporäre Callback-Objekte: Du bringst hiermit zum Ausdruck, dass die Übergabe
// eines temporären Objekts keinen Missbrauch der Funktion darstellt sondern von dir einkalkuliert
// und behandelt wurde.
template <typename Callback> void DoSomething( Container& container , Callback && callback) {
// Solange nicht explizit gecastet, verhält sich jede rvalue-Referenz wie eine normale Referenz, der
// Typ des Ausdrucks "callback" entspricht hier also "Callback &" und passt wie gespuckt auf deine
// ursprüngliche Funktion.
return DoSomething(container, callback);
}
Hoffe, das hilft.