logo
volkov / C++ / Бьерн Страуструп-Справочное руководство по С++

R.5.17 Операции присваивания

Существует несколько операций присваивания, все они выполняются

справа налево. Для всех них требуется, чтобы левым операндом был

изменяемый адрес. Тип выражения присваивания совпадает с типом

левого операнда. Результат операции присваивание - значение,

хранящееся в левом операнде после того как произошло присваивание.

Результат является адресом.

выражение-присваивания:

выражение-условия

унарное-выражение операция-присваивания выражение-присваивания

операция-присваивания: один из

= *= /= %= += -= >>= <<= &= ^= |=

При простом присваивании (=) значение выражения заменяет собой значение

объекта, с которым сопоставляется левый операнд. Если оба операнда

арифметического типа, правый операнд, прежде чем произойдет

присваивание, преобразуется к типу левого операнда. Неявные

преобразования к типу перечисления ($$R.7.2) не производятся, поэтому

если левый операнд имеет тип перечисления, правый операнд должен

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

операнд должен быть типа указателя или выражением-константой, дающим

результат 0. Правый операнд преобразуется к типу левого операнда,

прежде выполнения присваивания.

Указатель типа T* const можно присваивать указателю типа T*, но

обратное присваивание считается незаконным ($$R.7.1.6). Объекты

типа const T или volatile T можно присваивать по адресу типа T или

volatile T (см. так же $$R.8.4).

Если левый операнд имеет тип указателя на член, правый операнд

должен быть типа указатель на член или выражением-константой,

дающим результат 0; перед присваиванием правый операнд преобразуется

к типу левого операнда.

Присваивание объектам класса X ($$R.9) задается функцией

X::operator=() ($$R.13.4.3). Если пользователь не определил

свою функцию X::operator=(), для присваивания используется

стандартный вариант ($$R.12.8). Отсюда следует, что объект класса,

который является прямым или непрямым производным от X, и

однозначно описан как производный в части public ($$R.4.6),

можно присвоить объекту X.

Указатель на член класса B можно присваивать указателю на член

того же типа класса D при условии, что D является прямым или

непрямым производным класса B, и однозначно описан как

производный в части public ($$R.10.1.1).

Присваивание объекту типа "ссылка на T" сводится к присваиванию

объекту типа T, который обозначается ссылкой.

Выполнение выражение вида E1 op= E2 эквивалентно выполнению

E1 = E1 op (E2), однако E1 вычисляется лишь один раз. В операциях

+= и -= левый операнд может быть указателем, в этом случае правый

(целочисленный) операнд преобразуется так, как объяснялось в $$R.5.7.

Все правые операнды и все левые операнды, не являющиеся ссылками,

должны быть арифметического типа.

Для объектов класса присваивание в общем случае не совпадает с

инициализацией ($$R.8.4, $$R.12.1, $$R.12.6, $$R.12.8).

Yandex.RTB R-A-252273-3
Yandex.RTB R-A-252273-4