Czy ten fragment kodu jest prawidłowy, czy powoduje niezdefiniowane zachowanie?Wywołanie c_str pustego ciągu znaków
std::string s;
assert(strlen(s.c_str())==0);
Jeśli to nie jest niezdefiniowane zachowanie, czy powyższa asercja przejdzie?
Czy ten fragment kodu jest prawidłowy, czy powoduje niezdefiniowane zachowanie?Wywołanie c_str pustego ciągu znaków
std::string s;
assert(strlen(s.c_str())==0);
Jeśli to nie jest niezdefiniowane zachowanie, czy powyższa asercja przejdzie?
Tak to będzie działać (jeśli dołączyć ()
do c_str
aby faktycznie wywołania funkcji) i twierdzenie minie.
To błąd kompilacji (jeśli masz włączone potwierdzenia), ponieważ const char *(std::string::*)()
, nie można przekonwertować na const char *
.
(Tongue tylko do połowy w policzek.)
To jest doskonale zdefiniowane, a twierdzenie mija. Funkcja c_str() zawsze zwraca poprawny łańcuch C zakończony zerem.
Zwykle używa się pustej(), aby przetestować pusty ciąg.