Почему переменная const не может быть передана по ссылке? - PullRequest
0 голосов
/ 09 декабря 2018

В моих примечаниях к лекции сказано:

Аргументом для ссылочного параметра должна быть переменная, а не константа или выражение.

И, таким образом,

int f(double & var); // function prototype
...
const double t = 4.0;
int ret = f(t); 

f(t) незаконно.

Но я не понимаю, почему t было бы незаконно.t - это константа, но все же переменная, и я не думаю, что есть что-то неправильное, передавая t по ссылке.

Ответы [ 3 ]

0 голосов
/ 09 декабря 2018

Если у вас есть ссылочный параметр, то передаваемый объект должен фактически (по крайней мере, быть в состоянии) занимать память, а константа (в отличие от переменной const) - нет.

То есть следующее будет нормально:

void foo(int & n) {
  n = 3;
}
void bar() {
  int i;
  foo(i);
  std::cout << "i is " << i << std::endl;
}

, но если бы у вас было:

void qux() {
  foo(3);
}

, не было бы объекта для назначения в foo, который можно назначить.

Обратите внимание, что вы можете передатьконстанта как ссылка на const (т. е. MyType const &), это разрешено, потому что проблема присваивания не существует, когда ссылка на const.

0 голосов
/ 09 декабря 2018

Позвольте мне дополнить мой комментарий ответом:

Во-первых, t не является константой, а является константной переменной.Константа будет 4,0.Ваши лекционные заметки в основном говорят о том, что вы не можете делать что-то вроде int ret = f (4.0);

Во-вторых, то, что вы видите, является несовпадением типов.const как классификатор является частью типа.Вы не можете сделать следующее:

const int x = 1;
int& ref_x = x;

ошибка: ссылка привязки типа 'int &' к 'const int' отбрасывает квалификаторы

Тем не менее, это допустимо для передачиconst квалифицированные переменные в качестве ссылки, либо используйте константную ссылку, либо отбрасывайте константу:

  • Используйте константную ссылку const int& const_int_ref = x;
  • Используйте const_cast: int& rx = const_cast<int&>(x);

Я предпочитаю первое, где возможно.

0 голосов
/ 09 декабря 2018

Что если функция f изменяет var?Этого не должно произойти, если t равно const.

Вот пример реализации f:

int f(double & var)
{
    var += 1;
    return var;
}

Это изменит все, что передается в качестве аргумента. Но , если аргумент был const ... неудача.Тогда это не разрешено, и компилятор явно говорит вам об этом.

Это ошибка, сгенерированная компилятором:

error: binding reference of type 'double&' to 'const double' discards qualifiers

Итак, передав переменную const в функцию (безнеконстантный аргумент), вы говорите компилятору игнорировать const ness переменной в первую очередь.

Если вы хотите передать его по ссылке, передайте его const -reference:

int f(const double & var)  //  or int f(double const& var)
{
    var += 1;
    return var;
}

Это указывает компилятору сохранять постоянство своих аргументов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...