c++ c++11 initialization list-initialization

c++ class constructor



Diferencia entre return{} y return Object{} (2)

El primero es copy-list-initialization , el constructor apropiado (es decir, Object::Object(int) ) se seleccionará para construir el valor de retorno.

El segundo construirá un Object temporal mediante direct-list-initialization (que también llama Object::Object(int) ), luego lo copiará al valor de retorno. Debido a la elección de la copia (que está garantizada por C ++ 17), aquí se omite la construcción de copiar o mover.

Así que para tu ejemplo tienen el mismo efecto; Object::Object(int) se usa para construir el valor de retorno. Tenga en cuenta que para el primer caso, si el constructor es explicit entonces no se utilizará.

  • Inicialización de lista directa (se consideran constructores explícitos y no explícitos)

  • copy-list-initialization (se consideran constructores explícitos y no explícitos, pero solo se pueden llamar constructores no explícitos)

¿Hay alguna diferencia significativa entre estas dos funciones?

struct Object { Object(int i) : i{i} { } int i; }; Object f() { return {1}; } Object g() { return Object{1}; }


No hay diferencia en su ejemplo como está escrito. Pero surgirá una diferencia si marca el constructor explicit . Entonces solo g sería correcto, ya que realiza la inicialización directa, mientras que f hace una forma de inicialización de copia y no puede usar un constructor explícito.