Który typ deklarować, aby uniknąć kopiowania i upewnić się, że zwracana wartość jest przenoszona
Przypuszczam, że
Mam funkcjęA f()
;Chcę zainicjować zmienną lokalnąa
do wartości zwracanejf
;Nie chcę polegać na RVO;Jaka jest najlepsza opcja (i dlaczego), aby uniknąć zwracanej wartościf
kopiowane kiedy
a
może wymagać modyfikacjiwiem toa
nie zostanie zmodyfikowanyOpcje:
za)A a = f();
b)A&& a = f();
do)const A& = f();
re)const A&& = f();
EDYTOWAĆ:
Powiedziałbym:
b)do)Ponieważ oba używają odwołań i unikają dodatkowej kopii (której RVO również mogłoby uniknąć, ale nie jest to gwarantowane). Dlaczego więc widzę opcję a) sugerowaną przez większość czasu?
Wydaje mi się, że sedno pytania brzmi: rozumiem, że a) najprawdopodobniej ma taki sam efekt jak c), więc dlaczego nie użyć c) zamiast a), aby rzeczy były wyraźne i niezależne od kompilatora?