Требуются ли операторы присваивания для возврата? - PullRequest
8 голосов
/ 14 ноября 2011

Согласно стандарту C ++, могу ли я быть уверен, что операторы присваивания для встроенных переменных возвращают (исходное значение)?

Или это зависит от реализации (но просто в большинстве популярных компиляторов это реализовано)?

Ответы [ 5 ]

10 голосов
/ 14 ноября 2011

Да, это гарантировано:

5.17 Операторы присваивания и составного присваивания

Оператор присваивания (=) и составные операторы присваивания всей группы справа налево. Все требуют изменяемого lvalue как их левый операнд и возвращает значение l, относящееся к левому операнду .

Это относится к встроенным типам. С пользовательскими типами он может возвращать что угодно.

5 голосов
/ 14 ноября 2011

Это зависит от того, что вы подразумеваете под «исходным значением».

Например:

#include <iostream>
int main() {
    int i;
    std::cout << (i = 1.9) << "\n";
}

отпечатков 1. Выражение присваивания возвращает новое значение LHS (а именно 1), а не «исходное значение» RHS (1.9).

Я не уверен, о чем ты хотел спросить.

3 голосов
/ 14 ноября 2011

Согласно стандарту C ++, могу ли я быть уверен, что операторы присваивания для встроенных переменных возвращают (исходное значение)?

Редактировать Думаю, я понял. Да: вы можете быть уверены, что встроенные типы возвращают исходное значение по ссылке после operator=, *=, /=, -=, +=, ^=, ~=, &= and |=.

«Для построения переменных» немного загадочно для меня. Тем не менее,

X makeX()
{
    return X();
} // must have accessible copy constructor

// ...
X x;
x = makeX(); // ... _and_ assignment operator

Или это зависит от реализации

Должно не быть ( редактировать см. Стандартную справку от UncleBens )

0 голосов
/ 14 ноября 2011

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

Обратите внимание, что пользовательские назначения типов или расширенные назначения могут вместо этого, например, возвращать void. Это не очень хорошая практика, и ее не следует делать (это вызывает неожиданный эффект для пользователей - не очень хорошая вещь), но это технически возможно, поэтому, если вы пишете, например, библиотеку шаблонов, вы не должны делать это предположение, если это действительно не важно для тебя.

0 голосов
/ 14 ноября 2011

Да.В противном случае семантика оператора просто не будет работать.

...