Що ж, люди вже почали жалітися на те,
що ніхто не задає питань і взагалі, якийсь застій )
Пропоную трохи розім'яти мізки,
та подумати чому наступний приклад працює,
та чи працює взагалі?
struct dummy {
void foo() {}
};
typedef dummy& rdummy;
void foo(const rdummy& dummy) {
dummy.foo();
}
int main() {
dummy d;
foo(d);
}
Добряче подумайте, та дайте розгорнуту відповіть, що відбувається у коді.
P.S.
Тут є відповідь (але спочатку напишіть, що ви думаєте, чому це працює,
а потім дивіться сюди, всім піс):
▼Прихований текст
Ви точно цього хочете?
▼Прихований текст
Ну, гаразд
на справді все буде ОК і код валідний, він компілюється та запускається.
Чому? І що ж там відбувається?
Все просто, у ф-ї
void foo(const rdummy& dummy)
,
тип буде (dummy& const) &, де const проігнорується,
залишиться (dummy&) &, а "подвійне" посилання схлопнеться до dummy&.
Кваліфікатор const був прогінорований згідно правил С++,
щодо константних посилань:
Cv-qualified references are ill-formed except when the cv-qualifiers are introduced through the use of a typedef-name or decltype-specifier, in which case the cv-qualifiers are ignored.
А (&) i (&) згідно правил зжаття посилань, було конвертовано в (&).
Надіюсь ви дізнались для себе щось нове ))