Co to jest? typ && ...

0

Każda klasa jak się nie zdefiniuje własnych dostaje defaultowy konstruktor i konstruktor kopiujący. To rozumiem. Ale co to jest to co pokazałem na screenie. Co oznaczają te &&?

5

Rvalue references.

Prostując, to co widzisz na zdjęciu to move constructor

0

Ten move constructor to się go zawsze jawnie słowem move wywołuje?

3

To jest właśnie problem z tym, że ludzie nie poznają nowych standardów. Cały czas czytam teksty zachęcające do uczenia się z książek pana Grębosza - one były dobre, ale w latach 90, potem jak wyszła wersja standard - to przez chwilę też bym polecił, ale właśnie tam tego nie znajdziesz, jak i nie znajdziesz informacji, że ma być:

const char *s = 'tekst";

bo

char *s = "test";

w nowych kompilatorach się nie skompiluje. Język się zmienia. I o ile czasem warto znać starsze standardy, to nowe znać tez trzeba, szczególnie jak się uczysz, zaczynaj od nowych!

move cosntruktor i przypisanie przenoszące zostanie wywołane tam, gdzie ma to sens, gdzie zamiast kopiować wszystko optymalniej byłoby przekazać wartości, np jeśli na chwilę musiałby byc stworzony obiekt tymczasowy, co przy małych konstrukcjach nie ma znaczenia, ale przy dużym wektorze ma.

3
Mikilll napisał(a):

Ten move constructor to się go zawsze jawnie słowem move wywołuje?

move() nie wywołuje move constructora.

move() zwraca podany parametr, zrzutowany na T&&.
To, w odpowiednim kontekście, doprowadza do niejawnego wywołania konstruktora przenoszącego lub przenoszącego operatora przypisania.

Takie wywołanie move:

vector<int> w;
...
move(w);

nie robi nic.

0

A te nowe standardy to są gdzieś przystępnie opisane czy tylko dokumentacja? Poza tym move constructor jest z którego standardu?

Poza tym nie wiem czy dobrze rozumiem. Tak jak np. tablice defaultowo są przekazywane do funkcji przez referencje tak np.tablice są defaultowo przekazywane przez move constructor zamiast przez copy constructor?

Czy dostajemy jakiś defaultowy move constructor, podobnie jak to ma miejsce z copy constructor?

0

Czy wyjaśnił by ktoś tak w skrócie co robi to słówko forward i czym się różni od move?

3

move rzutuje wszystko na rvalue, natomiast forward rzutuje lvalue na lvalue, a rvalue na rvalue.

Masz tu przystępny tutorial z move semantics razem z przykładowymi implementacjami move i forward: http://thbecker.net/articles/rvalue_references/section_01.html

0
 #include <iostream>

using namespace std;

void MyFunction(int & value)
{
    cout << "Lvalue reference" << endl;
}

void MyFunction(int && value)
{
    cout << "Rvalue reference" << endl;
}

int main()
{
    MyFunction(3);
    return 0;
}

Dlaczego to mi się nie kompiluje? Mam taki sam schemat kodu jak na stacku.

10 linia:

error: expected ',' or '...' before '&&' token|

2

bo masz kompilator ze sredniowiecza (lub nie masz flagi ustawionej)

http://ideone.com/mgfzLv

polecam Ci 0.2 z mojego kursu (link w stopce)

1

Czy wyjaśnił by ktoś tak w skrócie co robi to słówko forward i czym się różni od move?

forward służy do „odzyskania” statusu r-value reference. Jeśli parametr funkcji wygląda np. tak T&& value, to samo value jest przecież l-value, mimo że jest typu T&&.
Dzięki forward<>() odzyskujemy r-value jeśli do funkcji rzeczywiście przekazano r-value.

C++ to trudna język.

1 użytkowników online, w tym zalogowanych: 0, gości: 1