Подтвердить что ты не робот

С++ Double Address Operator? (&&)

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

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

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

4b9b3361

Ответ 1

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

Ответ 2

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

Ответ 3

Как упоминалось в других ответах, токен && в этом контексте является новым для С++ 0x (следующий стандарт С++) и представляет собой "ссылку на rvalue".

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

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

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

Ответ 4

&& является новым в С++ 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.
}

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

Ответ 5

Я считаю, что это оператор перемещения. 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=()!

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