Привет всем!
Кто может поясните ошибку:
int a = 0;
int &r1 = ++a; // ok;
int &r2 = a++; // compile error: error C2440: 'initializing' : cannot convert from 'int' to 'int &'
Если можно киньте ответ ввиде ссылки на параграф в TC++PL (Stroustrup) или в
FAQ
Заранее спасибо за ответы!
Здравствуйте, __Dmitry__, Вы писали:
__D>Привет всем!
__D>Кто может поясните ошибку:
__D>__D>int a = 0;
__D>int &r1 = ++a; // ok;
__D>int &r2 = a++; // compile error: error C2440: 'initializing' : cannot convert from 'int' to 'int &'
__D>
__D>Если можно киньте ответ ввиде ссылки на параграф в TC++PL (Stroustrup) или в FAQ
__D>Заранее спасибо за ответы!
Результатом выполнения постфиксного оператора ++ является rvalue. Для инициализации неконстантной ссылки требуется lvalue. Вот поэтому и возникает такая ошибка. С помощью rvalue можно инициализировать только константную ссылку:
const int &r2 = a++;
Здравствуйте, __Dmitry__, Вы писали:
__D>Привет всем!
__D>Кто может поясните ошибку:
__D>__D>int a = 0;
__D>int &r1 = ++a; // ok;
__D>int &r2 = a++; // compile error: error C2440: 'initializing' : cannot convert from 'int' to 'int &'
__D>
Результат выражения ++a — lvalue, и это lvalue может быть использовано для инициализации неконстантной ссылки.
Результат выражения a++ — rvalue, и оно не может быть использовано для инициализации неконстантной ссылки. Константную ссылку инициализировать можно:
const int& r3 = a++;
__D>Если можно киньте ответ ввиде ссылки на параграф в TC++PL (Stroustrup)
5.5 References
__D>или в FAQ
lvalue/rvalueАвтор(ы): Павел Кузнецов
Дата: 02.01.2004
lvalue и rvalue — что это такое.
Здравствуйте, Bell, Вы писали:
B>Здравствуйте, __Dmitry__, Вы писали:
__D>>Привет всем!
__D>>Кто может поясните ошибку:
__D>>__D>>int a = 0;
__D>>int &r1 = ++a; // ok;
__D>>int &r2 = a++; // compile error: error C2440: 'initializing' : cannot convert from 'int' to 'int &'
__D>>
B>Результат выражения ++a — lvalue, и это lvalue может быть использовано для инициализации неконстантной ссылки.
B>Результат выражения a++ — rvalue, и оно не может быть использовано для инициализации неконстантной ссылки. Константную ссылку инициализировать можно:
B>B>const int& r3 = a++;
B>
__D>>Если можно киньте ответ ввиде ссылки на параграф в TC++PL (Stroustrup)
B>B>5.5 References
__D>>или в FAQ
B>lvalue/rvalueАвтор(ы): Павел Кузнецов
Дата: 02.01.2004
lvalue и rvalue — что это такое.
Спасибо, спасибо ...
Про rvalue и lvalue все понятно...
Меня мучает другой вопрос, где описано, что
a++ — rvalue?
правильно ли я понимаю приблизительные
эквивалентые более низкоуровневые псевдокоды:
// случай int &r1 = ++a;
_asm{
mov r1, dword ptr a
inc a
}
// случай int &r2 = a++;
_asm{
mov temp, dword ptr a
mov r2, dword ptr temp ;error because temp is temprory
inc a
}
З.Ы.: Приблизительные потому что на сложно выразить мнемониками
отождествление ссылок r# с переменными, на которые создаются ссылки
Здравствуйте, __Dmitry__, Вы писали:
__D>Здравствуйте, Bell, Вы писали:
B>>Здравствуйте, __Dmitry__, Вы писали:
__D>>>Привет всем!
__D>>>Кто может поясните ошибку:
__D>>>__D>>>int a = 0;
__D>>>int &r1 = ++a; // ok;
__D>>>int &r2 = a++; // compile error: error C2440: 'initializing' : cannot convert from 'int' to 'int &'
__D>>>
B>>Результат выражения ++a — lvalue, и это lvalue может быть использовано для инициализации неконстантной ссылки.
B>>Результат выражения a++ — rvalue, и оно не может быть использовано для инициализации неконстантной ссылки. Константную ссылку инициализировать можно:
B>>B>>const int& r3 = a++;
B>>
__D>>>Если можно киньте ответ ввиде ссылки на параграф в TC++PL (Stroustrup)
B>>B>>5.5 References
__D>>>или в FAQ
B>>lvalue/rvalueАвтор(ы): Павел Кузнецов
Дата: 02.01.2004
lvalue и rvalue — что это такое.
__D>Спасибо, спасибо ...
__D>Про rvalue и lvalue все понятно...
__D>Меня мучает другой вопрос, где описано, что
__D>a++ — rvalue?
В стандарте 13.5.7 и 13.6. Показательная реализация такова:
class foo
{
public:
foo& operator++() // prefix ++ returns lvalue
{
//...
return *this;
}
foo operator++(int) // postfix returns rvalue
{
foo temp(*this);
this->operator++();
return temp;
}
};