Это «громоздко» отчасти потому, что должно быть.
Это:
zstring_span<> to_zspan(std::string& s) { return ensure_z(s); }
Является не безопасной операцией.Зачем?Поскольку, хотя верно, что s
является NUL-символом, вполне возможно, что фактический s
содержит внутренние NUL-символы.Это законная вещь, которую вы можете сделать с std::string
, но zstring_span
и кто бы то ни был, с этим не справится.Они будут обрезать строку.
В отличие от этого, преобразования string_span/view
безопасны с этой точки зрения.Потребители таких строк берут строку размера и, следовательно, могут обрабатывать встроенные NUL.
Поскольку преобразование zstring_span
небезопасно, должна быть некоторая явная запись о том, что выполняется что-то потенциально небезопасное.ensure_z
представляет эту явную запись.
Другая проблема заключается в том, что в C ++ нет механизма, позволяющего определить разницу между строковым аргументом и любым старым параметром const char*
или const char[]
.Поскольку голый const char*
может быть или не быть строковым литералом, вы должны предположить, что это не так, и, следовательно, использовать более подробное преобразование.
Кроме того, строковые литералы C ++ могут содержать встроенные NUL-символы, поэтомуПриведенные выше рассуждения применимы.
Проблема const
выглядит как ошибка кода, и вам, вероятно, следует подать ее как таковую.