Мне кажется, это ошибка компилятора MSVC.
Утверждение:
string fullSentence = '\0';
не должно компилироваться.
Действительно, естьне является допустимым (неявным) конструктором от char
(т.е. '\0'
) до std::string
. Ссылка здесь .
Обратите внимание, что gcc и clang не принимают этот код как действительный. MSVC делает.
Почему это так?
Глядя на код сборки, MSVC компилирует этот оператор с помощью следующего конструктора:
std::string::string(char const * const);
Передав '\0'
в качестве аргумента, он будет фактически преобразован в nullptr
.
Итак:
Создает строку ссодержимое инициализируется копией строки символов с нулевым символом в конце, на которую указывает s.Длина строки определяется первым нулевым символом.Поведение не определено, если [s, s + Traits :: length (s)) не является допустимым диапазоном (например, , если s является нулевым указателем ).
Таким образом, ваш код неопределенного поведения.