Здравствуйте, IROV.., Вы писали:
IRO>Здравствуйте, Smart_Ass, Вы писали:
S_A>>Какие фундаментальные и не очень отличия есть между указателем и ссылкой ? IRO>Ссылка это константный указатель.
Hello, IROV..!
You wrote on Wed, 28 Dec 2005 14:50:37 GMT:
I> Здравствуйте, IROV.., Вы писали:
I> вместо 0 ставим.. 1,2,3,4,5,6,7,8
И вместо void ставим int
With best regards, Sergey Zizyov. E-mail: ziserg@despammed.com
Здравствуйте, Smart_Ass, Вы писали:
S_A>Здравствуйте, IROV.., Вы писали:
IRO>>Здравствуйте, Smart_Ass, Вы писали:
S_A>>>Какие фундаментальные и не очень отличия есть между указателем и ссылкой ? IRO>>Ссылка это константный указатель.
S_A>Это не отличие, это как он реализован в С++.
А про какой язык ты вообще спрашываеш?
Ну смотрим..
есть
int const * ref_a = 0;
и
int a;
int & ref_a = a;
так вот некоторые говорят что сылка может сылаться только на обьект.. так вот я утверждаю что константный указатель тожа сылаеться на обьект..
в частности на обьект который находиться по адресу.. 0..
я с таким же успехом могу взять сылку с этого обьекта..
int &a = *(int*)0; — ведь по адресу 0 лежит какойто обьект..
а стереотип того что указатель на 0 это не валидный указатель.. это просто договореность.. с таким же успехом я могу считать.. указатель на 1 тожа невалидным..
так что раздницы между T const * и T & очень мало.. кроме как синтаксических нюансов.
IROV.. wrote: > в частности на обьект который находиться по адресу.. 0.. > я с таким же успехом могу взять сылку с этого обьекта.. > int &a = *(int*)0; — ведь по адресу 0 лежит какойто обьект..
Нет. Это Undefined Behaviour по Стандарту.
> а стереотип того что указатель на 0 это не валидный указатель.. это > просто договореность.. с таким же успехом я могу считать.. указатель на > 1 тожа невалидным..
Вообще-то, это не договоренность, а зафиксированое в Стандарте
требование. Кстати, "нулевой указатель" может и не быть численно равным
нолю.
... Несмотря на форму записи, ни один оператор не выполняет действий над ссылкой. Например:
void g()
{
int ii = 0;
int& rr = ii;
rr++; //ii увеличивается на 1int* pp = &rr; //pp указывает на ii
}
Выражение rr++ допустимо, но не увеличивает ссылку rr; ++ примееняется к целому значению ii. Как следствие значение ссылки нельзя изменить после инициализации.
...
Очевидной реализацией ссылки является (константный) указатель, при каждом использовании которого происходит разыменование.
... ссылка, в отличие от указателя, не является объектом, над которым можно выполнять операции.
В некоторых случаях компилятор может оптимизировать ссылку таким образом, что во время исполнения вообще не будет существовать объекта, представляющего ссылку.
Инициализация ссылки тривиальна, когда инициализатором является lvalue (объект, адресс которого можно получить; см.$4.9.6). Инициализатором для "просто" T& должно быть lvalue типа T.
Инициализатор для const T& не обязан быть lvalue и даже иметь тип T. В таких случаях:
[1] если необходимо, осуществляется неявное преобразование к типу T;
[2] результирующее значение помещается во временную переменную типа T;
[3] временная переменная используется как значение инициализатора.
Рассмотрим пример:
double& dr = 1; // ошибка: требуется lvalueconst double& cdr = 1; // правильно
Можно проинтерпретировать последнюю инициализацию следующим образом:
Временная переменная, созданная для хранения инициализатора, существует до конца области видимости инициализируемой ею ссылки.
Ссылки на переменные и ссылки на константы различаются: создание временной переменной в случае ссылки на переменную интенсивно провоцирует ошибки.
...
ССылки также применяются для написания функций, которые можно использовать и в левой, и в правой частях присваивания.
Здравствуйте, IROV.., Вы писали:
S_A>>>>Какие фундаментальные и не очень отличия есть между указателем и ссылкой ? IRO>>>Ссылка это константный указатель.
S_A>>Это не отличие, это как он реализован в С++. IRO>А про какой язык ты вообще спрашываеш?
По ходу дела хочу развеять одну путаницу. Константный указатель и указатель на константу — разные вещи.
Имелось в виду
T x, y;
T* const p = &x;
T& r = y;
*p = 1;
r = 2;
p = &y; // ошибка компиляции
А никак не
T const *p = &x;
*p = 1; // ошибка компиляции
p = &y;
IRO>так вот некоторые говорят что сылка может сылаться только на обьект.. так вот я утверждаю что константный указатель тожа сылаеться на обьект.. IRO>в частности на обьект который находиться по адресу.. 0.. IRO>я с таким же успехом могу взять сылку с этого обьекта.. IRO>int &a = *(int*)0; — ведь по адресу 0 лежит какойто обьект..
Указатель можно инициализировать
— адресом валидного объекта
— адресом "за концом массива"
— нулевым указателем
— мусором (адресом разрушенного объекта)
(В трёх последних случаях запрещено разыменовывать; в двух последних — запрещена адресная арифметика).
Ссылку же можно инициализировать только (адресом) валидного объекта. В дальнейшем ссылка может инвалидироваться, но это совершенно другой разговор.
Все остальные случаи — это UB.
IRO>а стереотип того что указатель на 0 это не валидный указатель.. это просто договореность.. с таким же успехом я могу считать.. указатель на 1 тожа невалидным..
Нет такого "указатель на 0". Есть специальное значение "нулевой указатель". Оно эквивалентно литеральному нулю и булевскому false.
Нулевой указатель, а также указатели за конец массива — валидные, но неразыменовываемые.
Указатель, полученный reinterpret_cast'ом или другим способом из мусора — невалидный.
IRO>так что раздницы между T const * и T & очень мало.. кроме как синтаксических нюансов.
Да, но этих синтаксических и семантических "нюансов" — очень много.
Здравствуйте, Cyberax, Вы писали:
C>IROV.. wrote: >> в частности на обьект который находиться по адресу.. 0.. >> я с таким же успехом могу взять сылку с этого обьекта.. >> int &a = *(int*)0; — ведь по адресу 0 лежит какойто обьект.. C>Нет. Это Undefined Behaviour по Стандарту.
int *j = 0;
int &i = *j;
а так? в чем незаконность?
>> а стереотип того что указатель на 0 это не валидный указатель.. это >> просто договореность.. с таким же успехом я могу считать.. указатель на >> 1 тожа невалидным.. C>Вообще-то, это не договоренность, а зафиксированое в Стандарте C>требование.
А зафиксированое в Стандарте это не договореность?
C>Кстати, "нулевой указатель" может и не быть численно равным нолю.
Я об этом тожа написал
Здравствуйте, Кодт, Вы писали:
К>Здравствуйте, IROV.., Вы писали:
S_A>>>>>Какие фундаментальные и не очень отличия есть между указателем и ссылкой ? IRO>>>>Ссылка это константный указатель.
S_A>>>Это не отличие, это как он реализован в С++. IRO>>А про какой язык ты вообще спрашываеш?
К>По ходу дела хочу развеять одну путаницу. Константный указатель и указатель на константу — разные вещи. Опечатался..
int j = 1;
int * const c_ptr_i = &j;
*c_ptr_i = 2;
int k = 1;
c_ptr_i = &k;
IRO>>так вот некоторые говорят что сылка может сылаться только на обьект.. так вот я утверждаю что константный указатель тожа сылаеться на обьект.. IRO>>в частности на обьект который находиться по адресу.. 0.. IRO>>я с таким же успехом могу взять сылку с этого обьекта.. IRO>>int &a = *(int*)0; — ведь по адресу 0 лежит какойто обьект..
К>Указатель можно инициализировать К>- адресом валидного объекта К>- адресом "за концом массива" К>- нулевым указателем К>- мусором (адресом разрушенного объекта) К>(В трёх последних случаях запрещено разыменовывать; в двух последних — запрещена адресная арифметика).
К>Ссылку же можно инициализировать только (адресом) валидного объекта. В дальнейшем ссылка может инвалидироваться, но это совершенно другой разговор. К>Все остальные случаи — это UB.
Можно узнать.. если я зделаю ссылку на обьект которого не существует.. и не буду с ним работать.. то это тожа UB?
IRO>>а стереотип того что указатель на 0 это не валидный указатель.. это просто договореность.. с таким же успехом я могу считать.. указатель на 1 тожа невалидным..
К>Нет такого "указатель на 0". Есть специальное значение "нулевой указатель". Оно эквивалентно литеральному нулю и булевскому false. К>Нулевой указатель, а также указатели за конец массива — валидные, но неразыменовываемые.
А что означает валидный указатель?
или же "нулевой указатель" это некий терминатор.. но со своими правилами? и какая практичная польза от этого?
IRO>>так что раздницы между T const * и T & очень мало.. кроме как синтаксических нюансов. К>Да, но этих синтаксических и семантических "нюансов" — очень много.
неспорю.
IROV.. wrote: > int *j = 0; > int &i = *j; > а так? в чем незаконность?
В разыменовании нулевого указателя — это UB. Во многих случаях это
просто НЕ будет работать.
> C>Вообще-то, это не договоренность, а зафиксированое в Стандарте > C>требование. > А зафиксированое в Стандарте это не договореность?
Нет, это стандарт.