inicialización directa como
std::istringstream stream("blah blah");
es necesario cuando el tipo en cuestión, aquí std::istringstream
de la biblioteca de C++ estándar, no tiene un constructor de copia accesible.
Una inicialización copia, como
std::istringstream stream = "blah blah"; //! NOT VALID
requiere una constructor de copia accesible, porque se realiza como si se crea un objeto temporal en el lado derecho de =
, y como si se utiliza ese temporal a continuación, para inicializar la variable que se está declarando
En la otra dirección, en C++ 98 se necesita la sintaxis de inicialización de copia para utilizar los inicializadores de llaves . Por ejemplo, la inicialización directa no se puede usar para inicializar un agregado. Pero puede utilizar la inicialización de copia con un inicializador de llaves:
#include <string>
using namespace std;
struct Answer
{
int nVotes;
string description;
};
int main()
{
Answer const incorrect = { 26, "they're the same!" };
Answer const correct = { -1, "nah, they're different, actually" };
}
Por lo tanto, hay diferencias significativas.
Generalmente prefiero la sintaxis de inicialización de copia debido a la claridad. Pero a veces, como se muestra arriba, la inicialización directa es, desafortunadamente, necesaria. Algunas personas, p.El autor de libros de texto de C++, Francis Glassborow, ha aterrizado en la inicialización directa como su sintaxis de inicialización preferida (no estoy seguro de por qué, es menos claro para mis ojos, y presenta el problema "más molesto"), y para ellos es la necesidad de copia la inicialización en algunos casos, eso es desafortunado.
Saludos & HTH.,
Qué es una asignación implícita? ¿Te refieres al operador de asignación predeterminado? – ybungalobill
¿Qué quiere decir con "asignación implícita". –
bool bValue1 = verdadero; // asignación explícita bool bValue2 (falso); // asignación implícita ¿Hace la diferencia? – Mike