URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 7771
[ Назад ]

Исходное сообщение
"ссылки в с++"

Отправлено rasmon , 13-Дек-08 18:11 
У Страуструпа в его книге "язык программирования с++" есть такие слова (в главе о функциях):
Разрешение преобразования для аргумента (функции) типа const T& обеспечивает гарантию того, что аргументу будет присвоен тот же набор значений, что и аргументу типа T.
Так что -  тип "ссылка на постоянный объект" законно может быть приведена к типу "ссылка на объект"?

Содержание

Сообщения в этом обсуждении
"ссылки в с++"
Отправлено const , 13-Дек-08 23:34 
>Так что -  тип "ссылка на постоянный объект" законно может быть приведена к типу "ссылка на объект"?

Цитата довольно заковыристая... На самом деле, при вызове функции const T& и T автоматически приводятся друг к другу. Про T& ничего не было сказано.
Например:

void f(const int &x) { g(x); }
void g(int y) { f(y); }
int main() { g(42); }


"ссылки в с++"
Отправлено rasmon , 16-Дек-08 16:37 
>>Так что -  тип "ссылка на постоянный объект" законно может быть приведена к типу "ссылка на объект"?
>
>Цитата довольно заковыристая... На самом деле, при вызове функции const T& и
>T автоматически приводятся друг к другу.

Cогласен - заковыристая. И у Струструпа таких мест много. И хотя в некоторых местах можно разобраться по прилагаемым примерам, то тут непонятно. Это находится в главе "функции", часть "передача аргументов":

void update(float& i);
void g(double d){
update(d); //ошибка. И только потому, что это не то что хотел программист. Самим языком //это как бы не запрещено,
}

но:
float qrt(const float&);
void g(double d){
qrt(d); //а так можно - почему?
}

И там  же находится вышеприведенная цитата.


"ссылки в с++"
Отправлено vic , 16-Дек-08 16:44 
>void update(float& i);
>void g(double d){
>update(d); //ошибка. И только потому, что это не то что хотел программист.
>но:
>float qrt(const float&);
>void g(double d){
>qrt(d); //а так можно - почему?

причина в преобразовании типов :)


"ссылки в с++"
Отправлено rasmon , 16-Дек-08 16:53 
>>void update(float& i);
>>void g(double d){
>>update(d); //ошибка. И только потому, что это не то что хотел программист.
>>но:
>>float qrt(const float&);
>>void g(double d){
>>qrt(d); //а так можно - почему?
>
>причина в преобразовании типов :)

дык вот почему здесь double можно преобразовывать в const float& , когда double во float&
нельзя? Почему нельзя - я понял. Но почему по той же причине не запрещено преобразование дабла в ссылку на постоянный флоат?


"ссылки в с++"
Отправлено vic , 16-Дек-08 18:23 
>[оверквотинг удален]
>>>float qrt(const float&);
>>>void g(double d){
>>>qrt(d); //а так можно - почему?
>>
>>причина в преобразовании типов :)
>
>дык вот почему здесь double можно преобразовывать в const float& , когда
>double во float&
> нельзя? Почему нельзя - я понял. Но почему по той же
>причине не запрещено преобразование дабла в ссылку на постоянный флоат?

можно ли изменять временный объект? :)


"ссылки в с++"
Отправлено rasmon , 16-Дек-08 18:54 

>можно ли изменять временный объект? :)

можно ответить "да", а можно и "нет".


"ссылки в с++"
Отправлено const86 , 19-Дек-08 10:56 
>дык вот почему здесь double можно преобразовывать в const float& , когда double во float& нельзя? Почему нельзя - я понял. Но почему по той же причине не запрещено преобразование дабла в ссылку на постоянный флоат?

Первое нельзя, потому что у нас есть double и мы хотим передать в функцию ссылку на него как ссылку на float. Функция по этой ссылке что-нибудь запишет и что мы получим?
А во втором случае ссылка константная, поэтому функция туда ничего писать не будет. Мы можем создать временный float, присвоить ему значение нашего double и передать в функцию ссылку на float.