Вывод типа для ссылок на шаблоны - PullRequest
1 голос
/ 08 июля 2019

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

template<typename T>
void f(T&);

int x=0;
int y=1;
f(x+y);

Кажется, что для этого кода происходит вывод типа. Но почему? Не существует правила свертывания ссылок, которое в конце выдаст int &&.

1 Ответ

5 голосов
/ 08 июля 2019

В соответствии со стандартом C ++ 17 [temp.deduct.call] / 3:

... Если P является ссылочным типом, тип, на который ссылается P используется для вывода типа....

Здесь P равно T&, поэтому компилятор удаляет ссылку и сравнивает T с типом аргумента x+y.Поэтому он выводит T как int.Затем на этапе разрешения перегрузки возникает ошибка, поскольку значение r * типа int не может быть связано с параметром типа int&.

Вывод аргумента шаблона должен происходить до разрешения перегрузки, поскольку в противном случае компиляторне будет знать, какие типы параметров использовать для разрешения перегрузки.

...