C ++ Оператор двойного адреса? (&&) - PullRequest
97 голосов
/ 28 декабря 2010

Я читаю исходный код STL и понятия не имею, что должен делать адресный оператор &&.Вот пример кода из stl_vector.h:

vector&
operator=(vector&& __x) // <-- Note double ampersands here
{
    // NB: DR 675.
    this->clear();
    this->swap(__x); 
    return *this;
}

Имеет ли смысл «Адрес адреса»?Почему у него два оператора адреса вместо одного?

Ответы [ 5 ]

100 голосов
/ 14 сентября 2016

&& является новым в C ++ 11. int&& a означает, что "a" является ссылкой на r-значение. && обычно используется только для объявления параметра функции. И это только принимает выражение r-значения. Если вы не знаете, что такое 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.
}

Надеюсь, что это информативно.

92 голосов
/ 28 декабря 2010

Это код C ++ 11 . В C ++ 11 токен && может использоваться для обозначения «ссылки на значение».

81 голосов
/ 28 декабря 2010

&& является новым в C ++ 11 и означает, что функция принимает RValue-Reference - то есть ссылку на аргумент, который собирается быть уничтоженным.

29 голосов
/ 28 декабря 2010

Как уже упоминалось в других ответах, токен && в этом контексте является новым для C ++ 0x (следующего стандарта C ++) и представляет собой «ссылку на значение».

Ссылки на Rvalue являются одними изболее важные новые вещи в предстоящем стандарте;они обеспечивают поддержку семантики «перемещения» на объектах и ​​позволяют совершенную пересылку вызовов функций.

Это довольно сложная тема - одно из лучших введений (это не просто краткий обзор) - статья Стефана Т. Лававея, «Rvalue References: C ++ 0x Особенности в VC10, Часть 2»

Обратите внимание, что статья все еще довольно тяжелое чтение, но оно того стоит.И хотя он находится в блоге Microsoft VC ++, вся (или почти вся) информация применима к любому компилятору C ++ 0x.

1 голос
/ 23 декабря 2014

Я считаю, что это оператор перемещения.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] << ' ';
}

Даже если мы дали вектору значения a, вектор b имеет значения.Это магия operator=()!

MSDN - Как создать конструктор перемещения

...