Mam funkcjaprzenieść semantyczny i struct
struct foo {
std::vector<int> v;
};
foo func();
będzie wektorem wewnątrz foo zostać przeniesione lub skopiowane po powrocie z funkcji?
Mam funkcjaprzenieść semantyczny i struct
struct foo {
std::vector<int> v;
};
foo func();
będzie wektorem wewnątrz foo zostać przeniesione lub skopiowane po powrocie z funkcji?
To zostanie przeniesiony. (*)
Ponieważ nie dają jednoznacznej konstruktora ruch dla swojej klasy foo
, kompilator niejawnie wygenerować jeden dla Ciebie, który wywołuje konstruktor przenieść (jeśli są dostępne) dla wszyscy członkowie twojej klasy. Ponieważ std::vector
definiuje konstruktor ruchu, zostanie wywołany.
za § 12,8/15 C++ 11 Standard:
niejawnie zdefiniowane konstruktor kopii/przejście przez nie związków klasy X wykonuje kopie memberwise/przenoszenie jego zasad i członków . [...]
Należy również zauważyć, że kompilator może odwoływać się do konstruktora kopiowania/przenoszenia klasy podczas zwracania obiektu według wartości. Ta optymalizacja nazywa się (Named) Return Value Optimization.
(*) Zakładam tutaj, że twoim przypadkiem użycia jest utworzenie lokalnego obiektu z automatycznym przechowywaniem wewnątrz foo()
i zwrócenie go.
Nie zostanie przeniesiony, jeśli 'foo', który zwróci, jest być może' foo' z czasem przechowywania statycznego. Prawdopodobnie są też inne przypadki. Ale tak, zgadzam się z tobą w sprawie, o którą pytający prawdopodobnie pyta. –
@ftopbit: OK, to prawda. Zakładałem, że chce zwrócić lokalny obiekt z automatycznym magazynowaniem. Edytowane, dziękuję. –
@BoPersson: Wspomniałem o tym, chociaż nie RVO jawnie. Zrobię to. –
Nie, zostanie przeniesiony. –
To całkowicie zależy od tego, co dzieje się wewnątrz 'func'. –
@BoPersson Nie do końca, ponieważ to pytanie dotyczy zwrotu 'wektora', podczas gdy chodzi o zwrócenie struct z domyślnym konstruktorem ruchu i elementem' vector'. – delnan