Acabo de sentir la necesidad de otra publicación absurda.
string str1 = "foo";
se llama copia-inicialización, porque lo que hace el compilador, si no se elide cualquier temporales, es:
string str1(string("foo"));
lado de la comprobación de que el constructor de conversión utilizado es implícita. De hecho, todas las conversiones implícitas están definidas por el estándar en términos de inicialización de copia. Se dice que una conversión implícita de tipo U a tipo T es válida, si
T t = u; // u of type U
es válido.
En constraste,
string str1("foo");
está haciendo exactamente lo que está escrito, y se llama inicialización directa. También funciona con constructores explícitos.
Por cierto, se puede desactivar elidiendo de provisionales mediante el uso de -fno-elide-constructores:
-fno-elide-constructors
The C++ standard allows an implementation to omit creating a temporary which
is only used to initialize another object of the same type. Specifying this
option disables that optimization, and forces G++ to call the copy constructor
in all cases.
La norma dice que prácticamente no hay diferencia entre
T a = u;
y
T a(u);
si T y el tipo de u son tipos primitivos. Entonces puedes usar ambos formularios. Creo que es solo el estilo lo que hace que las personas usen la primera forma en lugar de la segunda.
Algunas personas pueden usar la primera en alguna situación, porque quieren eliminar la ambigüedad de la declaración:
T u(v(a));
Migh mirar a alguien como una definición de una variable u
que se inicializa el uso de un temporal de un tipo v
que obtiene un parámetro para su constructor llamado a
. Pero, en realidad, lo que el compilador hace con esto es la siguiente:
T u(v a);
crea una declaración de función que toma un argumento de tipo v
, y con un parámetro llamado a
. Así que la gente hace
T u = v(a);
para eliminar la ambigüedad que, a pesar de que podría haber hecho
T u((v(a)));
también, porque nunca hay paréntesis alrededor de los parámetros de función, el compilador lo leería como una definición de variable en lugar de una declaración de la función también :)
¡Ah! Sí, así será: en C, el operador = era la única manera, por lo que todavía "se siente bien" para los veteranos. Gracias. –