A czy istnieją opcje g ++, które mogą wykryć niepoprawną inicjalizację std :: string z NULL const char *?Unikanie niepoprawnej inicjalizacji std :: string z NULL const char * przy użyciu g ++
byłem w procesie toczenia kilka pól do int te std :: string, tj
struct Foo
{
int id;
Foo() : id(0) {}
};
... zamienił się:
struct Foo
{
std::string id;
Foo() : id(0) {} //oooops!
};
ja całkowicie pomijane złe 'id' inicjalizacja z 0 i g ++ nie dała mi żadnych ostrzeżeń. Ten błąd został wykryty w czasie wykonywania (konstruktor std :: string zgłosił wyjątek), ale naprawdę chciałbym wykryć takie rzeczy w czasie kompilacji. Czy jest jakiś sposób?
Niestety, 0 jest jedyną wartością, która nie spowoduje błędu przy nieprawidłowej konwersji z int na wskaźnik. Ponieważ 0 jest zerową stałą wskaźnika, więc można ją zamienić na dowolny typ wskaźnika. Nie wiem, co możesz zrobić poza tym, że, jak mówi użytkownik, nie pisz tego inicjatora. –
Właściwym rozwiązaniem byłoby dodanie prywatnego konstruktora 'std :: string :: string (int);'. Byłoby to lepsze dopasowanie, a zatem spowodować błąd podczas kompilacji. – MSalters
Nie jestem pewien, czy chodziło ci o to w ten sposób, ale to może zadziałać, jako jednorazowy test, aby wykryć błędy wynikające z tej rundy zmian z 'int' na' string'. Zmodyfikuj 'std :: basic_string' w standardowych nagłówkach g ++, sprawdź, czy nowy kod się kompiluje, a następnie szybko go zmień, zanim ktokolwiek zauważy. –