Ответ 1
Это С++ 11. В С++ 11 токен &&
может использоваться для обозначения "ссылки на rvalue".
Я читаю исходный код STL, и я понятия не имею, что делать с оператором адресов &&
. Вот пример кода из stl_vector.h
:
vector&
operator=(vector&& __x) // <-- Note double ampersands here
{
// NB: DR 675.
this->clear();
this->swap(__x);
return *this;
}
Имеет ли смысл "Адрес адреса"? Почему у него есть два адресных оператора вместо одного?
Это С++ 11. В С++ 11 токен &&
может использоваться для обозначения "ссылки на rvalue".
&&
является новым в С++ 11, и это означает, что функция принимает RValue-Reference - то есть ссылка на аргумент, который вот-вот будет уничтожен.
Как упоминалось в других ответах, токен &&
в этом контексте является новым для С++ 0x (следующий стандарт С++) и представляет собой "ссылку на rvalue".
Ссылки Rvalue являются одной из наиболее важных вещей в предстоящем стандарте; они позволяют поддерживать семантику "move" на объектах и обеспечивают идеальную пересылку вызовов функций.
Это довольно сложная тема - одно из лучших представлений (это не просто бегло) - статья Стефана Т. Лавави, "Rvalue References: C + + 0x Особенности в VC10, часть 2"
Обратите внимание, что статья по-прежнему довольно тяжелая, но стоит того. И хотя это на блоге Microsoft VС++, все (или почти все) информация применима к любому компилятору С++ 0x.
&&
является новым в С++ 11. int&& a
означает, что "a" является ссылкой на r-значение. &&
обычно используется только для объявления параметра функции. И он принимает только выражение r-value. Если вы не знаете, что такое r-значение, простое объяснение состоит в том, что у него нет адреса памяти. Например. число 6, а символ "v" - оба значения r. int a
, a является l-значением, однако (a+2)
является r-значением. Например:
void foo(int&& a)
{
//Some magical code...
}
int main()
{
int b;
foo(b); //Error. An rValue reference cannot be pointed to a lValue.
foo(5); //Compiles with no error.
foo(b+3); //Compiles with no error.
int&& c = b; //Error. An rValue reference cannot be pointed to a lValue.
int&& d = 5; //Compiles with no error.
}
Надеюсь, что это информативно.
Я считаю, что это оператор перемещения. operator=
- оператор присваивания, например vector x = vector y
. Вызов функции clear()
звучит так, как будто он удаляет содержимое вектора, чтобы предотвратить утечку памяти. Оператор возвращает указатель на новый вектор.
Таким образом,
std::vector<int> a(100, 10);
std::vector<int> b = a;
for(unsigned int i = 0; i < b.size(); i++)
{
std::cout << b[i] << ' ';
}
Несмотря на то, что мы дали вектор значениям, вектор b имеет значения. Это волшебство operator=()
!