Оператор Двойного Адреса C++? (&&)


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

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

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

5 77

5 ответов:

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

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

&& новое в 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.
}

надеюсь, что это познавательно.

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

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

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

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

Я считаю, что оператор двигается. 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 -- как создать конструктор перемещения