Конструктор std::string_view неявно преобразует ссылку на C-массив в const char*.
Для array1 вызовется strlen (использовать N не будем, т.к. внутри литерала может быть \0).
array2 же не нуль-терминирован, и вызовет неопределённое поведение.
Поэтому предлагается определить более безопасный конструктор:
Текущее поведение меняется только там, где оно уже было неопределённым.
Если не делегировать конструкторы, а инициализировать поля, то можно добавить noexcept.
P. S. Для общности можно добавить template<typename CharT> std::char_traits<CharT>::length(const CharT* const, size_t max_length). Хотя там уже есть find…
C-массив можно инициализировать литералом или списком:
Конструктор
std::string_view
неявно преобразует ссылку на C-массив вconst char*
. Дляarray1
вызоветсяstrlen
(использоватьN
не будем, т.к. внутри литерала может быть\0
).array2
же не нуль-терминирован, и вызовет неопределённое поведение.Поэтому предлагается определить более безопасный конструктор:
Текущее поведение меняется только там, где оно уже было неопределённым. Если не делегировать конструкторы, а инициализировать поля, то можно добавить
noexcept
.Мотивационный пример с UB: https://godbolt.org/z/exYY8G997
P. S. Для общности можно добавить
template<typename CharT> std::char_traits<CharT>::length(const CharT* const, size_t max_length)
. Хотя там уже естьfind
…