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()) вычислить указатель конца. Инструмент статического анализа может жаловаться на это, но на самом деле это не должно.

Другие вопросы по тегам