Указатель массива вне диапазона запрещен с помощью constexprC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Указатель массива вне диапазона запрещен с помощью constexpr

Сообщение Anonymous »

Я реализую класс Array с методами constexpr. В моем проекте я разрешаю итератору превышать end(), потому что вместо того, чтобы делать: while ( it != arr.end() ), я делаю: while ( arr.finished(it)) путем внутреннего сравнения двух необработанных указателей. Он работает с экземплярами массива, отличными от constexpr, но не с экземплярами constexpr из-за следующей проблемы:

Код: Выделить всё

#include 

int main()
{
static constexpr std::array arr{};

constexpr const int* ptr = &arr[0];

constexpr const int* ptr2 = (const int*)ptr + 4;// error

return 0;
}
Я получил сообщение:

Код: Выделить всё

array subscript value 4 is outside the bounds of array type _Type {aka const int [3]}|
https://godbolt.org/z/MjbqEv
В Windows 10 и gcc10.1.0, расположенных по адресу C:\cygwin64\usr\local\bin
Я даже не разыменовываю указатель, поэтому меня немного злит «заботливость» компилятора.
Мой вопрос следующее:
Что я могу сделать, чтобы этот код скомпилировался и сохранил мой проектный выбор — наличие несвязанных итераторов? (а не только после последнего конца, что уже разрешено компилятором). Могу ли я отключить ошибку выхода за пределы с помощью gcc?

Подробнее здесь: https://stackoverflow.com/questions/640 ... -constexpr
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»