Ответ 1
В С++ 03 было не законно делать следующие
typedef int &ref;
ref &r = ...; // reference to reference!
Это часто вызывает проблемы для компиляции людей с действительно строгими или старыми компиляторами С++ 03 (GCC4.1, а также Comeau 8/4/03 не нравятся выше), потому что привязки объектов стандартных функций не заботятся "ссылка на ссылку", а иногда и создавать такие нелегальные типы.
В С++ 0x это называется "сбрасыванием ссылок", да. Большинство современных компиляторов С++ 03 делают это (например, T&
, где T
обозначает ссылочный тип T
снова), путем ретроактивного применения правила. Библиотека boost.call_traits позволяет легко объявлять такие параметры функции, так что ситуация "ссылка на ссылку" не возникает.
Обратите внимание, что const
не действует. A const
, примененный к эталонному типу, игнорируется. Поэтому, даже если компилятор поддерживает свертывание ссылок, следующее не является законным.
int const x = 0;
// illegal: trying to bind "int&" to "int const"!
ref const& r = x;