У Страуструпа в его книге "язык программирования с++" есть такие слова (в главе о функциях):
Разрешение преобразования для аргумента (функции) типа const T& обеспечивает гарантию того, что аргументу будет присвоен тот же набор значений, что и аргументу типа T.
Так что - тип "ссылка на постоянный объект" законно может быть приведена к типу "ссылка на объект"?
>Так что - тип "ссылка на постоянный объект" законно может быть приведена к типу "ссылка на объект"?Цитата довольно заковыристая... На самом деле, при вызове функции const T& и T автоматически приводятся друг к другу. Про T& ничего не было сказано.
Например:void f(const int &x) { g(x); }
void g(int y) { f(y); }
int main() { g(42); }
>>Так что - тип "ссылка на постоянный объект" законно может быть приведена к типу "ссылка на объект"?
>
>Цитата довольно заковыристая... На самом деле, при вызове функции const T& и
>T автоматически приводятся друг к другу.Cогласен - заковыристая. И у Струструпа таких мест много. И хотя в некоторых местах можно разобраться по прилагаемым примерам, то тут непонятно. Это находится в главе "функции", часть "передача аргументов":
void update(float& i);
void g(double d){
update(d); //ошибка. И только потому, что это не то что хотел программист. Самим языком //это как бы не запрещено,
}но:
float qrt(const float&);
void g(double d){
qrt(d); //а так можно - почему?
}И там же находится вышеприведенная цитата.
>void update(float& i);
>void g(double d){
>update(d); //ошибка. И только потому, что это не то что хотел программист.
>но:
>float qrt(const float&);
>void g(double d){
>qrt(d); //а так можно - почему?причина в преобразовании типов :)
>>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&
нельзя? Почему нельзя - я понял. Но почему по той же причине не запрещено преобразование дабла в ссылку на постоянный флоат?
>[оверквотинг удален]
>>>float qrt(const float&);
>>>void g(double d){
>>>qrt(d); //а так можно - почему?
>>
>>причина в преобразовании типов :)
>
>дык вот почему здесь double можно преобразовывать в const float& , когда
>double во float&
> нельзя? Почему нельзя - я понял. Но почему по той же
>причине не запрещено преобразование дабла в ссылку на постоянный флоат?можно ли изменять временный объект? :)
>можно ли изменять временный объект? :)можно ответить "да", а можно и "нет".
>дык вот почему здесь double можно преобразовывать в const float& , когда double во float& нельзя? Почему нельзя - я понял. Но почему по той же причине не запрещено преобразование дабла в ссылку на постоянный флоат?Первое нельзя, потому что у нас есть double и мы хотим передать в функцию ссылку на него как ссылку на float. Функция по этой ссылке что-нибудь запишет и что мы получим?
А во втором случае ссылка константная, поэтому функция туда ничего писать не будет. Мы можем создать временный float, присвоить ему значение нашего double и передать в функцию ссылку на float.