Non v'è alcun modo per l'ottimizzazione RVO per rompere il promessa di un const
, quindi non c'è alcun problema: RVO può essere eseguito.
Tuttavia, semantica move è influenzata dal const
. Disattiva efficacemente la semantica del movimento, ovvero le chiamate di un costruttore T(T&&)
o dell'operatore di spostamento. Quindi, in generale, non utilizzare const
su un valore restituito.
Scott Meyers originariamente raccomandava const
sui valori restituiti, per una codifica più sensata.
Quindi Andrei Alexandrescu, nel suo articolo su Mojo per DDJ, ha osservato che d'ora innanzi, con la semantica di spostamento, const
sui valori di ritorno dovrebbe essere meglio vietato e il precedente consiglio di Scott è stato ignorato.
Ora non mi sono mai preso la briga di imparare i vari acronimi RVO specializzati, come NRVO e così via. E una ragione principale è che questi hanno cambiato significato a a metà, originariamente con un significato con alcune funzionalità personalizzate nel compilatore g ++. La terminologia qui è solo un casino.
Quindi, se la mia terminologia è errata e dovrei davvero aver usato qualche altro acronimo, quindi non esitate a correggere! :-)
fonte
2013-01-20 22:24:34
Perché non includi i risultati dei tuoi esperimenti con almeno un compilatore? –
@MarcGlisse: Bene, Visual C++ 2008 lo ha ottimizzato, ma non sono sicuro che lo standard lo permetta o meno. – Mehrdad