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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
mzarb
-211 / 7 / 1
Регистрация: 14.01.2013
Сообщений: 141
#1

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

10.03.2013, 12:35. Просмотров 871. Ответов 5
Метки нет (Все метки)

Встречал упоминания что для постинкремента создается временная копия, но дальше не объясняется. Получается, что переменной с преинкрементом можно присвоить значение, потому как возвращается её адрес, а для постинкремента адрес временной копии? Если можно, то лучше покажите реализацию постинкремента и преинкремента.
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++
C++ Почему *(a+j) не rvalue?
C++ Семантика перемещения rvalue\lvalue ссылок
Почему оператор сложения двух временных объектов возвращает lvalue ссылку? C++
Rvalue ссылки C++
C++ Rvalue vector
C++ Нюансы синтаксиса и семантики: что такое rvalue и lvalue?
Что такое rvalue и lvalue C++
C++ Rvalue и lvalue ссылки

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Croessmah
Модератор
Эксперт CЭксперт С++
 Аватар для Croessmah
12498 / 7060 / 792
Регистрация: 27.09.2012
Сообщений: 17,442
Записей в блоге: 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
1240 / 989 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
10.03.2013, 13:12     Почему i++ это rvalue, а ++i lvalue? #4
Цитата Сообщение от mzarb Посмотреть сообщение
Встречал упоминания что для постинкремента создается временная копия, но дальше не объясняется. Получается, что переменной с преинкрементом можно присвоить значение, потому как возвращается её адрес, а для постинкремента адрес временной копии?
Примерно так. Дело именно в том, что копия временная, существует только на время вычисления утверждения, содержащего постинкремент, и не является полноценным объектом (у неё нет имени; к ней нельзя обратиться в другой части утверждения, только непосредственно как к результату постинкремента, но не самостоятельному значению). Тогда как переменная, которую увеличивает преинкремент, таким объектом является. В этом и разница между rvalue и lvalue и причина, по которой результат постинкремента получает характеристику rvalue.
alsav22
5410 / 4806 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
10.03.2013, 13:20     Почему i++ это rvalue, а ++i lvalue? #5
Цитата Сообщение от mzarb Посмотреть сообщение
Получается, что переменной с преинкрементом можно присвоить значение, потому как возвращается её адрес, а для постинкремента адрес временной копии?
При постинкременте: создаётся временна копия переменной, потом значение переменной увеличивается, возвращается сохранённое во временной копии старое значение. При преинкременте: увеличивается значение переменной, возвращается новое значение. Как-то так...
silent_1991
Эксперт C++
4949 / 3025 / 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?
Ответ Создать тему
Опции темы

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