Si tiene un compilador que admita referencias rvalue, se moverá al vector, lo que a veces es bastante barato.
Una alternativa a eso es construir directamente el objeto en el vector, lo que se puede hacer con vec.emplace_back("abc");
. Esto solo invoca un constructor.
Ambas son funciones de C++ 11. La elisión de copia no está permitida aquí, por lo que sin esas características la copia aún se realizará.
Sin embargo, si el constructor de copia no tiene efectos secundarios observables (que no debería tener de todos modos), un compilador inteligente aún puede realizar esa optimización, porque la regla "como-si" permite cualquier optimización que da como resultado mismo comportamiento observable. Sin embargo, no sé si algún compilador actual hace eso. De lo contrario, dudo que alguien gaste el esfuerzo de agregar tal optimización porque las referencias de valores ponen fin a esa necesidad.
No lo creo porque 'vector' (asignadores de STL en realidad) utiliza la ubicación' new'. –
@Seth Carnegie: ¿cómo se relaciona con la colocación 'new'? digamos que tiene suficiente espacio libre en vector, entonces un compilador puede simplemente construir una instancia de 'A' en el lugar. –
@Nya porque el compilador probablemente no sepa dónde se creará (no es que no pueda, pero no lo hará, porque los escritores del compilador no escribieron esa optimización). –