Какова цель использования ссылки на ссылку в С++?

В моих приключениях, изучающих библиотеки boost, я сталкивался с сигнатурами функций, у которых есть параметры, которые являются ссылкой на ссылку на объект.

Пример:

void function(int && i);

Какова цель/польза от этого, а не просто ссылаться на объект? Я предполагаю, что есть один, если он в boost.

Ответ 1

Это не ссылка на ссылку; нет такой вещи.

Что вы видите, это С++ 0x ссылка rvalue, обозначаемая двойными амперсандами, &&. Это означает, что аргумент i для функции является временным, поэтому функции разрешено клонировать свои данные, не вызывая проблем с вызывающим кодом.

Пример:

void function(int &i);  // A
void function(int &&i); // B
int foo();

int main() {
    int x = foo();
    function(x);     // calls A
    function(foo()); // calls B, because the return value is a temporary
}

Это редко полезно при использовании простых int s, но очень полезно при определении конструкторов перемещения, например. Конструктор перемещения похож на конструктор копирования, за исключением того, что он может безопасно "украсть" внутренние данные из исходного объекта, потому что он временный, который перестанет существовать после возврата конструктора перемещения.

Ответ 2

Это не ссылка на ссылку. Это ссылка rvalue, которая является новой функцией, поддерживаемой предстоящим стандартом С++ 0x.

Ответ 3

То, что вы смотрите, это rvalue-reference. Это новая функция языка С++ 0x. См. здесь или менее формально здесь.

Исходное предложение можно найти здесь