Что такое ссылка R-Value, которая должна появиться в следующем стандарте c ++? - PullRequest
1 голос
/ 11 мая 2009

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

Ответы [ 4 ]

3 голосов
/ 11 мая 2009

Это позволяет вам различать код, который вызвал вас, передавая ссылку на r-значение или 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

Используя ссылку на r-значение, мы можем разрешить передавать ссылки на временные ссылки, такие как в первом примере выше:

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

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

3 голосов
/ 11 мая 2009

Взгляните на Почему C ++ 0x rvalue не является ссылкой по умолчанию? , что довольно хорошо объясняет их практическое использование.

1 голос
/ 11 мая 2009

Вот действительно длинная статья от Стефана Т. Лававея

0 голосов
/ 11 мая 2009
...