Инициализация ссылки
От: __Dmitry__ Россия  
Дата: 19.08.08 04:18
Оценка:
Привет всем!

Кто может поясните ошибку:
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

Заранее спасибо за ответы!
Re: Инициализация ссылки
От: Анатолий Широков СССР  
Дата: 19.08.08 04:27
Оценка:
Здравствуйте, __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++;
Re: Инициализация ссылки
От: Bell Россия  
Дата: 19.08.08 04:28
Оценка:
Здравствуйте, __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 — что это такое.
Любите книгу — источник знаний (с) М.Горький
Re[2]: Инициализация ссылки
От: __Dmitry__ Россия  
Дата: 19.08.08 16:28
Оценка:
Здравствуйте, 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# с переменными, на которые создаются ссылки
Re[3]: Инициализация ссылки
От: Анатолий Широков СССР  
Дата: 19.08.08 19:19
Оценка:
Здравствуйте, __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;
    } 
};
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.