Wpis z mikrobloga

Sprawdzam projekt cppcheckiem i dostałem wskazówkę, żeby pętlę zamienić na std::transform.
Napisałem sobie test, żeby zobaczyć jak będzie zachowywał się obiekt po takiej zmianie i widzę, że przy każdym obiekcie wywoływany jest konstruktor przenoszący. Robię coś źle, czy po prostu std::transform w takim prostym przypadku wykorzystuje więcej zasobów od pętli?

Co byście użyli w takiej sytuacji?
https://godbolt.org/z/7fMbPabEo

#cpp
  • 7
  • Odpowiedz
@dupasmoka: Ale wtedy robię move z pierwszego kontenera? Załóżmy, że chcę zrobić kopię za pomocą std::transform. Jak użyłbym tej zakomentowanej pętli to mam po prostu trzy konstruktory kopiujące co jest moim celem. Jeżeli się nie da tak zrobić transformem to czy jest sens go użyć?
  • Odpowiedz
@Gerax9: lambda by default zwraca przez wartość, zatem zwracasz w tej lambdzie kopię. dorzuć tam ->decltype(auto) w lambdzie, to będzie referencję zwracać i nie będzie przenoszenia
  • Odpowiedz
@Gerax9: jednakże w korzystając z transforma chcemy tak naprawę tworzyć nowe obiekty(czyli zwracać przez wartość(rvo) i przenosić), a nie zwracać referencje do istniejących, więc zastanów się co tak naprawdę chcesz zrobić. chyba, że zwracasz referencję do membera, to ok
  • Odpowiedz