Аддитивные операторы + и - группа слева направо. Обычные арифметические преобразования выполняются для операндов арифметического или перечислительного типа.
additive-expression: multiplicative-expression additive-expression + multiplicative-expression additive-expression - multiplicative-expression
Для дополнения, либо оба операнда должны иметь арифметический тип перечисления или тип перечисления без области действия, либо один операнд должен быть указателем на полностью определенный тип объекта, а другой должен иметь целочисленный тип перечисления или тип перечисления без области действия.
Для вычитания должно выполняться одно из следующих условий:
оба операнда имеют арифметический тип или тип перечисления без области действия; или
оба операнда являются указателями на cv-определенные или cv-неквалифицированные версии одного и того же полностью определенного типа объекта; или
левый операнд является указателем на полностью определенный тип объекта, а правый операнд имеет целочисленный или незаданный тип перечисления.
Результатом бинарного + оператора является сумма операндов. Результатом бинарного - оператора является разница, полученная в результате вычитания второго операнда из первого.
Когда выражение, имеющее целочисленный тип, добавляется к указателю или вычитается из него, результат имеет тип операнда указателя. Если выражение P указывает на элемент x[i] объекта массива x с n элементами,86 выражения P + J и J + P (где J имеет значение j) указывают на (возможно, гипотетический) элемент x[i+j] if 0≤i+j≤n; в противном случае поведение не определено. Точно так же выражение P - J указывает на (возможно, гипотетический) элемент x[i−j] if 0≤i−j≤n; в противном случае поведение не определено.
Когда вычитаются два указателя на элементы одного и того же объекта массива, тип результата является определяемым реализацией целочисленным типом со знаком; этот тип должен быть того же типа, который определен std::ptrdiff_t в <cstddef> заголовке ([support.types]). Если выражения P и Q указывают на элементы x[i] иx[j] одного и того же объекта массива x, соответственно, выражение P - Q имеет значение i−j; в противном случае поведение не определено. [ Note: Если значение i−j не входит в диапазон представимых значений типа std::ptrdiff_t, поведение не определено. ] — end note
Для сложения или вычитания, если выражения P или Q имеют тип «указатель на cv T», где T и тип элемента массива нет similar, поведение не определено. [ Note: В частности, указатель на базовый класс не может использоваться для арифметики указателей, когда массив содержит объекты типа производного класса. ] — end note
Если значение 0 добавляется к значению нулевого указателя или вычитается из него, результатом является значение нулевого указателя. Если вычитаются два значения нулевого указателя, результат сравнивается со значением 0, преобразованным в тип std::ptrdiff_t.
Для этой цели объект, не являющийся элементом массива, считается принадлежащим к одноэлементному массиву; см [expr.unary.op]. Указатель последнего элемента массива x из n элементов считаются эквивалентным указателем на гипотетическом элемент x[n] для этой цели; см [basic.compound].