2009-05-11 1 views
1

Что такое ссылка R-Value, которая вот-вот появится в следующем стандарте C++?Что такое ссылка R-Value, которая вот-вот появится в следующем стандарте C++?

+0

Я вижу этот вопрос один день становится ++ эквивалент C из «Как присоединиться к списку строк вместе в C#?»), То спросил и ответил каждые пару дней! –

ответ

1

Вот очень долго article от Stephan Т. Lavavej

+1

Остерегайтесь, однако, он упоминает в более поздней видео лекции, что статья основана на rvalue-ссылках v1, а правила впоследствии изменились на «v2». В исходной версии ссылки rvalue свяжутся с lvalues, но затем комитет изменил правила. Просто предупреждение. – woolstar

3

Это позволяет различать код, который назвал вас передавая ссылку на г-значение или L-значение. Например:

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 

с помощью ссылки г-значение, мы можем позволить перейти в ссылках на временных, таких, как в первом примере выше:

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 

Это более интересно, когда мы желая для передачи возвращаемого значения функции, которая создает объект для другой функции, которая использует этот объект.

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 

Конструктор движение действует как конструктор копирования, но он определен взять ссылку на г-значение, а не L-значение (константный) ссылки. Разрешено использовать семантику r-значения для перемещения данных из временного, созданного в create_vector, и вставлять их в аргумент consume_vector, не делая дорогой копии всех данных в векторе.

+0

create_vector вернется по значению, а не по ссылке rvalue (это будет ссылка на временную). Обратите внимание, что типы возвращаемых значений уже являются значениями r. –

Смежные вопросы