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.