std::string не использует нулевой символ для хранения признака конца строки.
Это, в частности, означает, что в std::string можно помещать произвольные данные, в том числе и нули.
Технически, с 11 стандарта, он обязан хранить завершающий 0 (c_str возвращает строку, заканчивающуюся нулём и адрес возвращаемый ей должен совпадать с &str[0])
Просто завершающий 0 является деталью реализации и не считается логической частью строки (strlen для c-строк тоже его не учитывает)
Это не значит, что в string можно помещать "нули" - обязательный метод c_str() класса string как-раз использует внутреннее хранение строки с завершающим нулём.
Но для использования string всё это не имеет никакого значения.
Олег Цилюрик: Можно. И все функции string будут работать адекватно. Только в случаях, когда нужна совместимость с c-string и её функциями, хранение нулей может помешать. В остальном, нулевой символ ничем не отличается от других символов, с точки зрения string.