Рассмотрим следующий код:
template <typename T>
void foo(const T& param) {
std::cout << __PRETTY_FUNCTION__ << std::endl;
std::cout << param;
}
int main()
{
foo<const int&>(5);
return 0;
}
Вывод дает:
void foo(const T&) [with T = const int&]
5
Здесь, очевидно, T
разрешено до const int&
(как сказано в распечатке, поскольку я явновынужден так).Однако это создает проблему: сигнатура функции принимает параметр типа const T&
, и в этом случае она расширяется до const const int& &
, что не является допустимым синтаксисом в C ++.
Но программа действительно работает нормально.Что тут происходит?
Обновление: я знаю, что T& &
рухнет до T&
.Однако в этом случае двойное const
также недопустимо, если вы пишете их явно, и я не вижу, чтобы правило свертывания шаблонов упоминало эту часть.
Обновление 2: Компиляция const const int x = 1;
дает error: duplicate ‘const’
.Множественное const не разрешено в c ++ (но на удивление в c все нормально).