initialisation directe comme
std::istringstream stream("blah blah");
est nécessaire lorsque le type en question, ici std::istringstream
de la bibliothèque standard C++, ne dispose pas d'un constructeur de copie accessible.
Une initialisation copie , comme
std::istringstream stream = "blah blah"; //! NOT VALID
nécessite un constructeur de copie accessible, car il est effectué comme si un objet temporaire est créé sur le côté droit de =
, et comme si cela temporaire est ensuite utilisé initialiser la variable déclarée.
Dans l'autre sens, en C++ 98, la syntaxe d'initialisation de copie est nécessaire pour utiliser initialisateurs d'accolades. Par exemple, l'initialisation directe ne peut pas être utilisée pour initialiser un agrégat. Mais vous pouvez utiliser l'initialisation de copie avec un initialiseur d'accolades:
#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" };
}
Il existe donc des différences significatives.
Je préfère généralement la syntaxe d'initialisation de copie en raison de la clarté. Mais parfois, comme indiqué ci-dessus, une initialisation directe est malheureusement nécessaire. Certaines personnes, par ex.Francis Glassborow, auteur de manuels C++, a plutôt choisi l'initialisation directe comme syntaxe d'initialisation préférée (je ne sais pas pourquoi, c'est moins clair à mes yeux, et introduit le problème de l'analyse la plus ennuyeuse), et pour eux c'est la nécessité de copier l'initialisation dans certains cas, c'est malheureux.
Vive & HTH.,
Qu'est-ce qu'une cession implicite? Voulez-vous dire l'opérateur d'affectation par défaut? – ybungalobill
Que voulez-vous dire par "affectation implicite". –
bool bValue1 = true; // affectation explicite bool bValue2 (false); // affectation implicite Cela fait-il une différence? – Mike