1

Тема: Const reference

Що ж, люди вже почали жалітися на те,
що ніхто не задає питань і взагалі, якийсь застій )
Пропоную трохи розім'яти мізки,
та подумати чому наступний приклад працює,
та чи працює взагалі?

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 (&) згідно правил зжаття посилань, було конвертовано в (&).

Надіюсь ви дізнались для себе щось нове ))

Подякували: Arete, leofun01, koala3