Почему это расширение шаблона разрешено в C ++? - PullRequest
0 голосов
/ 21 октября 2018

Рассмотрим следующий код:

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 все нормально).

1 Ответ

0 голосов
/ 21 октября 2018

Типы C ++ не формируются текстовой заменой.const T& где T равно void * равно void* const &, а не const void *&.

Ваш код пытается сформировать тип "lvalue reference to const T", где T is "lvalue referenceдо const int ".По правилам свертывания ссылок , которые вместо этого сформируют тип "lvalue reference to const int".

...