8 Expressions [expr]

8.7 Additive operators [expr.add]

Аддитивные операторы + и - группа слева направо. Обычные арифметические преобразования выполняются для операндов арифметического или перечислительного типа.

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 0i+jn; в противном случае поведение не определено. Точно так же выражение P - J указывает на (возможно, гипотетический) элемент x[ij] if 0ijn; в противном случае поведение не определено.

Когда вычитаются два указателя на элементы одного и того же объекта массива, тип результата является определяемым реализацией целочисленным типом со знаком; этот тип должен быть того же типа, который определен std​::​ptrdiff_­t в <cstddef> заголовке ([support.types]). Если выражения P и Q указывают на элементы x[i] иx[j] одного и того же объекта массива x, соответственно, выражение P - Q имеет значение ij; в противном случае поведение не определено. [ Note: Если значение ij не входит в диапазон представимых значений типа 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].