Ссылок в С нет, поэтому К.и Р. о них ничего не пишут.
e2e4 писал(а):
Вроде бы указатели и #define перекрывают все разумные применения ссылок.
Ничего подобного:
Код:
int& v = a[f(x)];
int b = v*v + 17 v;
никаким #define не покроешь. Даже если f(x) — просто выражение, а не вызов. Не говоря уж о приятных побочных эффектах.
e2e4 писал(а):
Возможно я не прав, поправьте.
reference в С++ — это приемлемый вид передачи параметра, подчёркивающий, что указатель — не массив, и не может меняться. Во всех остальных случаях (включая приведённый выше пример) она скорее задуривает мозги, чем помогает. Уж если надо, лучше так:
Код:
int* p = & a[f(x)];
int b = (*p)*(*p) + 17 (*p);
. Впрочем, это дело вкуса. Но уж больно больно наступать на эти детские грабли.
Пример, с которого всё началось — утрирован до безобразия. А вот попроще:
Код:
struct C_Test
{
bool & bTest;
bool bTestDefault;
C_Test():bTest(bTestDefault){}
void Set_New_Test(const bool & bNewTest)
{
bTest = bNewTest; // !!! потеря константности !!!
}
};
Вопрос: почему компилятор не выдаёт ошибки, хотя невооружённым взглядом видна потеря константности? А вот когда заменяем ссылку на указатели, выдаёт.
Добавлено спустя 1 час 1 минуту 20 секунд:e2e4 писал(а):
Вроде бы указатели и #define перекрывают все разумные применения ссылок.
Перечитал. При первом чтении пропустил указатели, что явно
не говорит в пользу моей внимательности.
Указатели и #define, видимо, покрывают. Роль ссылок, как я понимаю, такая же, как у ++: всегда можно написать x += 1, но ++x удобнее.