Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Инициализация ссылки

1.9K
01 марта 2008 года
strange kid
10 / / 23.02.2008
Приветствую всех!
Приведённый ниже фрагмент программы из книжки, должен продемонстрировать использование праводопустимого выражения в качестве параметра:
Код:
#include <iostream.h>

int n=0;
void invert(int & k = n)
{
    k=-k;
}

void main()
{
    int a=22, b=66;
    invert (a+b);
    cout<<a<<"\t"<<b<<"\n";
}


Но компилятор (Visual C++ 6) выдаёт ошибку:

--------------------Configuration: test - Win32 Debug--------------------
Compiling...
test.cpp
E:\C++\test\test.cpp(12) : error C2664: 'invert' : cannot convert parameter 1 from 'int' to 'int &'
A reference that is not to 'const' cannot be bound to a non-lvalue
Error executing cl.exe.

test.exe - 1 error(s), 0 warning(s)
------------------------------------------------------------------------------------

В общем помогите разобраться в чём дело. Такая запись:
 
Код:
invert (a+b);

недопустима? Может как то иначе можно записать?
3
01 марта 2008 года
Green
4.8K / / 20.01.2000
Цитата: strange kid
Приветствую всех!
Приведённый ниже фрагмент программы из книжки, должен продемонстрировать использование праводопустимого выражения в качестве параметра:
Код:
#include <iostream.h>

int n=0;
void invert(int & k = n)
{
    k=-k;
}

void main()
{
    int a=22, b=66;
    invert (a+b);
    cout<<a<<"\t"<<b<<"\n";
}


Но компилятор (Visual C++ 6) выдаёт ошибку:

--------------------Configuration: test - Win32 Debug--------------------
Compiling...
test.cpp
E:\C++\test\test.cpp(12) : error C2664: 'invert' : cannot convert parameter 1 from 'int' to 'int &'
A reference that is not to 'const' cannot be bound to a non-lvalue
Error executing cl.exe.

test.exe - 1 error(s), 0 warning(s)
------------------------------------------------------------------------------------

В общем помогите разобраться в чём дело. Такая запись:
 
Код:
invert (a+b);

недопустима? Может как то иначе можно записать?


Принимай аргумент по значению, а не поссылке:
void invert(int k)

87
01 марта 2008 года
Kogrom
2.7K / / 02.02.2008
Работающий вариант
Код:
#include <iostream>
using namespace std;

int n=0;
void invert(int & k = n)
{
    k=-k;
}

int main()
{
    int a=22, b=66;
    invert (a);
    invert (b);
    cout<<a<<"\t"<<b<<"\n";
}

У вас ссылка непонятно на какую переменную (a+b).
Зачем тут нужна переменная n? Наверно лучше использовать константу...
А лучше вообще записать просто void invert(int &k).
1.9K
01 марта 2008 года
strange kid
10 / / 23.02.2008
Цитата: Kogrom

У вас ссылка непонятно на какую переменную (a+b).


В том то и дело - цитата из книжки:
"...В программе для параметра-ссылки проиллюстрированы:...использование в качестве фактического параметра арифметического выражения a+b..."

Я так понял что автор книги (Язык С++. Подбельский) не прав. Там ещё такой вариант есть.

 
Код:
double d=3.33;
    invert(int(d));

Выдаётся та же ошибка.
87
01 марта 2008 года
Kogrom
2.7K / / 02.02.2008
Цитата: strange kid
Я так понял что автор книги (Язык С++. Подбельский) не прав.



Трудно сказать. Может это были примеры, как не надо делать? С другой стороны, примеры приводятся для какого-то раннего диалекта c++ (судя по включению библиотеки, типу функции main и т.д.). Лучше учиться по другой книжке.

3
01 марта 2008 года
Green
4.8K / / 20.01.2000
Инициализация ссылки описывается в 8.5.3 стандарта.
IMHO Подбельский неправ согласно пункту 5.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог