Y at-il des options g ++ qui peuvent détecter une initialisation incorrecte de std :: string avec NULL const char *?Eviter une mauvaise initialisation de std :: string avec NULL const char * en utilisant g ++
J'étais en train de transformer certains champs int en std :: ones chaîne, à savoir:
struct Foo
{
int id;
Foo() : id(0) {}
};
... transformé en:
struct Foo
{
std::string id;
Foo() : id(0) {} //oooops!
};
Je complètement oublié mauvais 'id' l'initialisation avec 0 et g ++ ne m'a donné aucun avertissement du tout. Cette erreur a été détectée dans le temps d'exécution (le constructeur std :: string a jeté une exception) mais j'aimerais vraiment détecter de telles choses au moment de la compilation. Y a-t-il un moyen?
Malheureusement, 0 est la valeur qui ne déclenchera pas une erreur pour une conversion invalide de int en pointeur. Car bien sûr, 0 est une constante de pointeur nulle, elle est donc convertible en n'importe quel type de pointeur. Je ne sais rien de ce que vous pouvez faire d'autre que, comme le dit le visiteur, ne pas écrire cet initialiseur en premier lieu. –
La solution appropriée aurait été d'ajouter un constructeur privé 'std :: string :: string (int); Ce serait une meilleure correspondance, et donc provoquer une erreur de compilation. – MSalters
Je ne sais pas si vous l'aviez voulu de cette façon, mais cela pourrait effectivement fonctionner, comme un test ponctuel pour détecter les erreurs résultant de cette série de changements de 'int' à' string'. Modifiez 'std :: basic_string' dans les en-têtes standard de g ++, vérifiez que le nouveau code compile, puis modifiez-le rapidement, avant que quelqu'un s'en aperçoive. –