Operator Podwójnego Adresu C++? (&&)

Czytam kod źródłowy STL i nie mam pojęcia, co powinien zrobić operator adresu &&. Oto przykład kodu z stl_vector.h:

vector&
operator=(vector&& __x) // <-- Note double ampersands here
{
    // NB: DR 675.
    this->clear();
    this->swap(__x); 
    return *this;
}
Czy "adres adresu" ma jakiś sens? Dlaczego ma dwa operatory adresowe zamiast jednego?
Author: Philip Kirkbride, 2010-12-28

5 answers

To jest C++11 kod. W C++11 token && może być używany jako "referencja rvalue".

 83
Author: aschepler,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:47:22

&& jest nowością w C++11 i oznacza, że funkcja przyjmuje rvalue-Reference - czyli odniesienie do argumentu, który ma zostać zniszczony.

 70
Author: Billy ONeal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-03-04 07:40:11

&& JEST NOWY W C++11. int&& a oznacza, że "a" jest odniesieniem do wartości R. && jest zwykle używany tylko do deklarowania parametru funkcji. I to tylko przyjmuje wyrażenie o wartości R. Jeśli nie wiesz, co to jest wartość r, proste wyjaśnienie jest takie, że nie ma ona adresu pamięci. Np. liczba 6 i znak " v " są wartościami R. int a, a jest wartością l, jednak {[5] } jest wartością r. Na przykład:

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.
}

Mam nadzieję, że to jest pouczające.

 53
Author: Lexseal Lin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-08 11:55:55

Jak wspominały inne odpowiedzi, token && w tym kontekście jest nowy w C++0x (następny standard C++) i reprezentuje "referencję rvalue".

Referencje Rvalue są jedną z ważniejszych nowości w nadchodzącym standardzie; umożliwiają obsługę semantyki 'move' na obiektach i pozwalają na doskonałe przekazywanie wywołań funkcji.

To dość złożony temat - jednym z najlepszych wstępów (nie tylko pobieżnych) jest artykuł Stephana T. Lavaveja, " Rvalue Referencje: C++0x funkcje w VC10, część 2"

Zauważ, że artykuł jest nadal dość ciężki do czytania, ale warto. I nawet jeśli jest to na blogu Microsoft VC++, wszystkie (lub prawie wszystkie) informacje mają zastosowanie do dowolnego kompilatora C++0x.

 27
Author: Michael Burr,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-11-30 00:11:58

Uważam, że jest to operator ruchu. operator= jest operatorem przypisania, powiedzmy vector x = vector y. Wywołanie funkcji clear() brzmi tak, jakby usuwało zawartość wektora, aby zapobiec wyciekowi pamięci. Operator zwraca wskaźnik do nowego wektora.

Tędy,

std::vector<int> a(100, 10);
std::vector<int> b = a;
for(unsigned int i = 0; i < b.size(); i++)
{
    std::cout << b[i] << ' ';
}

Mimo, że daliśmy wartości wektora a, wektor b ma wartości. To magia operator=()!

MSDN -- jak utworzyć konstruktor move

 1
Author: yash101,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-12-23 16:43:12