Вызов c_str пустой строки

#c

#c

Вопрос:

Этот фрагмент кода в порядке или это приводит к неопределенному поведению?

 std::string s;
assert(strlen(s.c_str())==0);
  

Если это не неопределенное поведение, пройдет ли приведенное выше утверждение?

Ответ №1:

Это совершенно точно определено, и утверждение выполняется. Функция c_str() всегда будет возвращать допустимую строку C, заканчивающуюся нулем.

Обычно для проверки наличия пустой строки используется функция empty().

Ответ №2:

Да, это сработает (если вы добавите () к c_str , чтобы заставить его фактически вызывать функцию), и утверждение пройдет.

Ответ №3:

Это ошибка компиляции (если у вас включены утверждения), поскольку const char *(std::string::*)() , не может быть преобразовано в const char * неявно.

(Язык только наполовину заострен.)