2009-05-11 1 views

Antwort

1

Hier ist eine wirklich lange article von Stephan T. Lavavej

+1

Aber aufgepasst, er erwähnt in einem späteren Video-Vortrag, dass der Artikel auf Rvalue Referenzen v1 basiert, und die Regeln später auf "v2" geändert. In der ursprünglichen Version würden rvalue-Referenzen an lvalues ​​binden, aber dann änderte das Komitee die Regeln. Nur eine Warnung. – woolstar

3

Es ermöglicht Ihnen, zwischen Code zu unterscheiden, die Sie vorbei einen Verweis auf ein r-Wert oder einen L-Wert genannt hat. Zum Beispiel:

void foo(int &x); 

foo(1); // we are calling here with the r-value 1. This would be a compilation error 

int x=1; 
foo(x); // we are calling here with the l-value x. This is ok 

eine r-Wert Referenz verwenden, können wir zulassen, dass in Verweisen auf Provisorien wie im ersten Beispiel oben weitergeben müssen:

void foo(int &&x); // x is an r-value reference 

foo(1); // will call the r-value version 

int x=1; 
foo(x); // will call the l-value version 

Das ist interessanter, wenn wir wollen, Übergeben des Rückgabewerts einer Funktion, die ein Objekt erstellt, an eine andere Funktion, die dieses Objekt verwendet.

std::vector create_vector(); // creates and returns a new vector 

void consume_vector(std::vector &&vec); // consumes the vector 

consume_vector(create_vector()); // only the "move constructor" needs to be invoked, if one is defined 

Der Umzug Konstruktor wirkt wie der Copykonstruktor, aber es definiert ist, einen R-Wert Bezug zu nehmen, anstatt eine L-Wert (const) Referenz. Es ist erlaubt, eine r-Wert-Semantik zu verwenden, um die Daten aus dem temporär erzeugten in create_vector zu verschieben und sie in das Argument consume_vector zu schieben, ohne eine teure Kopie aller Daten in dem Vektor zu machen.

+0

create_vector würde nach Wert, nicht nach Rvalue-Referenz (dies wäre eine Referenz auf eine temporäre) zurückgeben. Beachten Sie, dass Value-Return-Typen bereits rvalues ​​sind. –

Verwandte Themen