Форум программистов, компьютерный форум CyberForum.ru

Почему i++ это rvalue, а ++i lvalue? - C++

Восстановить пароль Регистрация
 
mzarb
-211 / 7 / 1
Регистрация: 14.01.2013
Сообщений: 141
10.03.2013, 12:35     Почему i++ это rvalue, а ++i lvalue? #1
Встречал упоминания что для постинкремента создается временная копия, но дальше не объясняется. Получается, что переменной с преинкрементом можно присвоить значение, потому как возвращается её адрес, а для постинкремента адрес временной копии? Если можно, то лучше покажите реализацию постинкремента и преинкремента.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.03.2013, 12:35     Почему i++ это rvalue, а ++i lvalue?
Посмотрите здесь:

C++ C++ Почему это не работает?
rvalue C++
Lvalue required почему высвечивается такая ошибка? C++
C++ Почему *(a+j) не rvalue?
C++ std::move, rvalue reference
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11832 / 6811 / 769
Регистрация: 27.09.2012
Сообщений: 16,885
Записей в блоге: 2
Завершенные тесты: 1
10.03.2013, 12:45     Почему i++ это rvalue, а ++i lvalue? #2
Цитата Сообщение от mzarb Посмотреть сообщение
Если можно, то лучше покажите реализацию постинкремента и преинкремента.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
 
class  MYSUPERPUPERINTEGER{
    int data;
public:
    MYSUPERPUPERINTEGER(int x=0):data(x){};
    int GetX(){return data;};
    MYSUPERPUPERINTEGER & operator++(){
        this->data+=1;
        return *this;
    }
    MYSUPERPUPERINTEGER operator++(int){
        int x=this->data;
        this->data+=1;
        return MYSUPERPUPERINTEGER(x);
    }
};
 
int main(){
    MYSUPERPUPERINTEGER a;
    std::cout<<(a++).GetX()<<std::endl;
    std::cout<<(++a).GetX()<<std::endl;
}
mzarb
-211 / 7 / 1
Регистрация: 14.01.2013
Сообщений: 141
10.03.2013, 13:08  [ТС]     Почему i++ это rvalue, а ++i lvalue? #3
Croessmah, Спасибо, принцип понятен. И ещё, в 15 строчке создался объект без имени? Получается, что постинкремент это rvalue, потому что если поставить его слева, то значение присвоится временному объекту, который разрушится после выхода из точки следования?
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
10.03.2013, 13:12     Почему i++ это rvalue, а ++i lvalue? #4
Цитата Сообщение от mzarb Посмотреть сообщение
Встречал упоминания что для постинкремента создается временная копия, но дальше не объясняется. Получается, что переменной с преинкрементом можно присвоить значение, потому как возвращается её адрес, а для постинкремента адрес временной копии?
Примерно так. Дело именно в том, что копия временная, существует только на время вычисления утверждения, содержащего постинкремент, и не является полноценным объектом (у неё нет имени; к ней нельзя обратиться в другой части утверждения, только непосредственно как к результату постинкремента, но не самостоятельному значению). Тогда как переменная, которую увеличивает преинкремент, таким объектом является. В этом и разница между rvalue и lvalue и причина, по которой результат постинкремента получает характеристику rvalue.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
10.03.2013, 13:20     Почему i++ это rvalue, а ++i lvalue? #5
Цитата Сообщение от mzarb Посмотреть сообщение
Получается, что переменной с преинкрементом можно присвоить значение, потому как возвращается её адрес, а для постинкремента адрес временной копии?
При постинкременте: создаётся временна копия переменной, потом значение переменной увеличивается, возвращается сохранённое во временной копии старое значение. При преинкременте: увеличивается значение переменной, возвращается новое значение. Как-то так...
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
14.03.2013, 14:20     Почему i++ это rvalue, а ++i lvalue? #6
Цитата Сообщение от alsav22 Посмотреть сообщение
При преинкременте: увеличивается значение переменной, возвращается новое значение.
Для данного сабжа важно именно то, что возвращается не значение, а ссылка на оригинальный объект, через которую и можно получить желаемое значение.
Yandex
Объявления
14.03.2013, 14:20     Почему i++ это rvalue, а ++i lvalue?
Ответ Создать тему
Опции темы

Текущее время: 12:34. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru