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? 5 answers
To jest C++11 kod. W C++11 token &&
może być używany jako "referencja rvalue".
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.
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.
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.
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=()
!
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