8 / 8 / 2
Регистрация: 14.01.2013
Сообщений: 141
1

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

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

Студворк — интернет-сервис помощи студентам
Встречал упоминания что для постинкремента создается временная копия, но дальше не объясняется. Получается, что переменной с преинкрементом можно присвоить значение, потому как возвращается её адрес, а для постинкремента адрес временной копии? Если можно, то лучше покажите реализацию постинкремента и преинкремента.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.03.2013, 12:35
Ответы с готовыми решениями:

C++ expressions - rvalue, glvalue, prvalue, xvalue, lvalue, а также rvalue reference: что есть что?
Доброго времени суток, не понимаю до конца деление С++ - выражений (приложение 1). Lvalue вроде...

Rvalue и lvalue ссылки
Здравствуйте, что расскажите, пожалуйста что такое lvalue и rvalue ссылки и с чем их едят, где...

Непонятное поведение rvalue/lvalue
Всем привет, объясните, пожалуйста, немного про р-вэлью и л-вэлью в этом коде: #include <iostream>...

Что такое rvalue и lvalue
как понимать эти штуки?

5
Неэпический
17850 / 10618 / 2049
Регистрация: 27.09.2012
Сообщений: 26,689
Записей в блоге: 1
10.03.2013, 12:45 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;
}
1
8 / 8 / 2
Регистрация: 14.01.2013
Сообщений: 141
10.03.2013, 13:08  [ТС] 3
Croessmah, Спасибо, принцип понятен. И ещё, в 15 строчке создался объект без имени? Получается, что постинкремент это rvalue, потому что если поставить его слева, то значение присвоится временному объекту, который разрушится после выхода из точки следования?
0
~ Эврика! ~
1256 / 1005 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
10.03.2013, 13:12 4
Цитата Сообщение от mzarb Посмотреть сообщение
Встречал упоминания что для постинкремента создается временная копия, но дальше не объясняется. Получается, что переменной с преинкрементом можно присвоить значение, потому как возвращается её адрес, а для постинкремента адрес временной копии?
Примерно так. Дело именно в том, что копия временная, существует только на время вычисления утверждения, содержащего постинкремент, и не является полноценным объектом (у неё нет имени; к ней нельзя обратиться в другой части утверждения, только непосредственно как к результату постинкремента, но не самостоятельному значению). Тогда как переменная, которую увеличивает преинкремент, таким объектом является. В этом и разница между rvalue и lvalue и причина, по которой результат постинкремента получает характеристику rvalue.
1
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
10.03.2013, 13:20 5
Цитата Сообщение от mzarb Посмотреть сообщение
Получается, что переменной с преинкрементом можно присвоить значение, потому как возвращается её адрес, а для постинкремента адрес временной копии?
При постинкременте: создаётся временна копия переменной, потом значение переменной увеличивается, возвращается сохранённое во временной копии старое значение. При преинкременте: увеличивается значение переменной, возвращается новое значение. Как-то так...
1
Эксперт С++
5055 / 3115 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
14.03.2013, 14:20 6
Цитата Сообщение от alsav22 Посмотреть сообщение
При преинкременте: увеличивается значение переменной, возвращается новое значение.
Для данного сабжа важно именно то, что возвращается не значение, а ссылка на оригинальный объект, через которую и можно получить желаемое значение.
1
14.03.2013, 14:20
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
14.03.2013, 14:20
Помогаю со студенческими работами здесь

Lvalue, xvalue, glvalue, rvalue, prvalue
Для чего понадобилось такое разделение выражений lvalue, xvalue, glvalue, rvalue, prvalue. Для...

Rvalue, lvalue, xvalue, prvalue, glvalue
Не в той теме начали обсуждать. Создам новую. то, что знаю я (выучил к собесед-ию), но глубокого...

Семантика перемещения rvalue\lvalue ссылок
Здравствуйте форумчани. Объясните пожалуйста процессы происходящии внутрии функции swap принимающую...

Нюансы синтаксиса и семантики: что такое rvalue и lvalue?
Добрый день, всем. Ребят, помогите разобраться в rvalue и lvalue. Читал об этом много чего, но все...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru