Оператор Двойного Адреса C++? (&&)
Я читаю исходный код STL и я понятия не имею, что &&
адрес оператор должен делать. Вот пример кода stl_vector.h
:
vector&
operator=(vector&& __x) // <-- Note double ampersands here
{
// NB: DR 675.
this->clear();
this->swap(__x);
return *this;
}
имеет ли смысл "адрес адреса"? Почему у него есть два адресных оператора вместо одного?
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=()
!