Powiel możliwe:
Is pass-by-value a reasonable default in C++11?Kiedy należy wybrać elizę kopiowania w odniesieniu do przekazywania argumentu przez odniesienie do const?
Czytam Want Speed? Pass by Value. Dave Abrahams o kopię elizji i RVO. I zastanawiam się, dlaczego potrzebujemy elizacji kopiowania?
Powiedziano mi zbyt wiele razy, że powinieneś przekazywać argumenty funkcji przez odwołanie do konstelacji, aby uniknąć kopiowania (prawie każda książka C++, którą przeczytałem, powiedziała mi o tym).
Załóżmy, że mamy dwie funkcje:
int f1(const string &s);
int f2(string s);
Jeżeli rzeczywisty argument jest rvalue, kopiowanie uniknie się w obu tych funkcjach. Ale jeśli rzeczywisty argument jest l-wartości, kopiowanie będzie unikane tylko w f1, a nie w f2. Dlaczego potrzebujemy tej funkcji?
Jedna uwaga: ten ostatni przypadek często występuje w konstruktorach. Biorąc pod uwagę 'struct S {S (...): s (s) {} std :: string s; }; ', to lepiej użyć' std :: string s' zamiast '...' zamiast 'std :: string const & s', ponieważ i tak będzie kopia. –
@MatthieuM: Ale pamiętaj, aby przenieść go do elementu, a nie go skopiować. tj. 'S (std :: string s): s (std :: move (s)) {}' –