Czytam kod źródłowy STL i nie mam pojęcia, co &&
ma 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 sens? Dlaczego ma dwa operatory adresu zamiast tylko jednego?
c++
stl
operator-keyword
memory-address
Anarki
źródło
źródło
&
, nie miałby nic wspólnego z operatorem address-of, ale zamiast tego oznaczałby, że__x
jest to odniesienie.Odpowiedzi:
To jest kod w C ++ 11 . W C ++ 11
&&
token może oznaczać „odwołanie do wartości r”.źródło
&&
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 wymaga tylko wyrażenia wartości r. Jeśli nie wiesz, czym jest wartość r, prostym wyjaśnieniem jest to, ż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(a+2)
jest wartością r. Na przykład:Mam nadzieję, że to pouczające.
źródło
int&& c = std::move( b );
, itp.&&
jest nowością w C ++ 11 i oznacza, że funkcja akceptuje odwołanie do RValue - to znaczy odwołanie do argumentu, który ma zostać zniszczony.źródło
Jak wspomniały inne odpowiedzi,
&&
token w tym kontekście jest nowy w C ++ 0x (następny standard C ++) i reprezentuje „odwołanie do wartości r”.Odniesienia do wartości R są jedną z ważniejszych nowości w nadchodzącym standardzie; umożliwiają obsługę semantyki „przenoszenia” na obiektach i pozwalają na doskonałe przekazywanie wywołań funkcji.
To dość złożony temat - jednym z najlepszych wstępów (to nie tylko pobieżne) jest artykuł Stephana T. Lavaveja „Rvalue References: C ++ 0x Features in VC10, Part 2”
Zwróć uwagę, że artykuł jest nadal dość ciężki, ale warto go przeczytać. I chociaż znajduje się na blogu Microsoft VC ++, wszystkie (lub prawie wszystkie) informacje mają zastosowanie do dowolnego kompilatora C ++ 0x.
źródło
&&
token nie jest nowy; jego znaczenie w deklaracjach jest. Ale wiedziałeś o tym.Uważam, że jest to operator ruchu.
operator=
jest, powiedzmy, operatorem przypisaniavector x = vector y
.clear()
Wywołanie funkcji brzmi tak, jakby usuwa zawartość wektora aby zapobiec wycieku pamięci. Operator zwraca wskaźnik do nowego wektora.Tą drogą,
Mimo że daliśmy wektorowi a wartości, wektor b ma wartości. To magia
operator=()
!MSDN - jak utworzyć konstruktor przenoszenia
źródło