Это не ссылка на ссылку; такой вещи нет.
Что вы видите, это C++ 0x rvalue reference, обозначаемый двойными амперсандами, &&
. Это означает, что аргумент 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
с, но очень полезно при определении перемещение конструкторов, например. Конструктор перемещения похож на конструктор копирования, за исключением того, что он может безопасно «украсть» внутренние данные из исходного объекта, потому что он временный, который перестанет существовать после возврата конструктора перемещения.
Ах, хорошо. Спасибо за уточнение. Как этот код в boost (1.42) прямо сейчас? Понятно, что в настоящее время boost для стандарта C++ 03. –
@Silver: он воспользуется функциями некоторых компиляторов. Некоторые компиляторы поддерживают C++ 0x (бит), и если Boost хочет обнаружить и использовать это, он будет. – GManNickG
@SilverSun: Boost использует условную компиляцию (#if и т. Д.) Для настройки того, что доступно для каждого компилятора. – 2010-04-18 20:31:30