Какова цель использования ссылки на ссылку в C ++? - PullRequest
11 голосов
/ 19 апреля 2010

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

Пример:

void function(int && i);

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

Ответы [ 3 ]

18 голосов
/ 19 апреля 2010

Это не ссылка на ссылку; такого нет.

То, что вы видите, это C ++ 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, но очень полезно, например, при определении конструкторов перемещения. Конструктор перемещения похож на конструктор копирования, за исключением того, что он может безопасно «украсть» внутренние данные из исходного объекта, потому что он временно прекратит свое существование после возврата конструктора перемещения.

3 голосов
/ 19 апреля 2010

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

2 голосов
/ 19 апреля 2010

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

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

...