Допустим, у меня есть функция copy
:
template <typename Buf>
void copy(
Buf&& input_buffer,
Buf& output_buffer)
{}
, в котором input_buffer
является универсальной ссылкой, а output_buffer
является ссылкой l-значения.
Reference collapsing rules
убедитесь, что input_buffer
действительно, независимо от выводимого типа Buf
, универсальной ссылки, а output_buffer
действительно является ссылкой l-значения.
Однако мне интересно, как здесь выводится тип Buf
.
Я обнаружил, что copy
передается r-значение как input_buffer
, (и l-значение как output_buffer
, очевидно) Buf
является не ссылочным типом.
Однако, если я передам два l-значения, программа не скомпилируется:
int i = 4;
int j = 6;
_copy(i, j);
Я ожидаю, что компилятор выведет Buf
в int&
. Следуя правилам свертывания ссылок, я бы ожидал, что input_buffer
станет ссылкой на l-значение, то есть & + && -> &
и output_buffer
тоже станут ссылкой на l-значение; & + & -> &
.
Итак, вопрос: почему этот код не компилируется?
(Примечание: я не обязательно спрашиваю о решении проблемы, но объясню.)
Если мне нужно уточнить, не стесняйтесь спрашивать.
EDIT:
если позвоните: copy(i, j);
GNU GCC Compiler дает:
ошибка: нет соответствующей функции для вызова функции «копировать (int &, int &)»
примечание: кандидат: шаблон void copy (Buf &&, buf &)
примечание: не удалось вывести / заменить аргумент шаблона:
примечание: вывели конфликтующие типы для параметра 'Buf' ('int &' и 'int')
если звоните:
copy<int&>(i, j);
OK.