2013-02-25 17 views
5

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?

+4

Nie, zostanie przeniesiony. –

+2

To całkowicie zależy od tego, co dzieje się wewnątrz 'func'. –

+0

@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

Odpowiedz

5

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.

+0

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

+1

@ftopbit: OK, to prawda. Zakładałem, że chce zwrócić lokalny obiekt z automatycznym magazynowaniem. Edytowane, dziękuję. –

+0

@BoPersson: Wspomniałem o tym, chociaż nie RVO jawnie. Zrobię to. –

Powiązane problemy