gsl::span - указатель на конец
Мне нужно передать gsl:: span в функцию, которая ожидает указатель на начало и указатель на конец. Я обновил функцию, чтобы использовать gsl:: span, чтобы избежать арифметического предупреждения об отсутствии указателя. Так как мне получить указатель до конца?
Я пытаюсь вызвать std:: ctype:: widen. Какое магическое заклинание я использую, чтобы получить значение конечного параметра для функции std:: ctype:: widen?
Я попробовал следующее.
&(*str.cend())
Я также попробовал следующее.
&str[srcLen]
Оба приводят к краху.
Я мог бы попробовать следующее, но это вызвало бы то самое предупреждение, которое я пытался решить.
str.data() + str.length()
Я начинаю думать, что все основные рекомендации C++ и библиотека поддержки рекомендаций слишком плохо продуманы, чтобы стоить усилий. Это второй раз, когда я сталкиваюсь с проблемой "gsl вызывает точное предупреждение, которое я пытался решить в первую очередь".
1 ответ
span
как и большинство библиотек C++, предназначен для использования с кодом, который принимает итераторы шаблонов. Вы можете пройти begin/end
алгоритмам или другим контейнерам и пр.
Такие API не работают почти так же хорошо, когда вам приходится иметь дело с интерфейсом, основанным исключительно на конкретных парах итераторов, таких как указатели. Это ничем не отличается от попытки получить указатель на конец std::vector
; вам придется делать арифметику с указателями рано или поздно.
Но если вас раздражают предупреждения об арифметике указателей, попробуйте использовать std::next(str.data(), str.size())
вычислить указатель конца. Инструмент статического анализа может жаловаться на это, но на самом деле это не должно.