Вывод типа шаблона C ++ 2003 пытается найти соответствующий тип аргумента. Если вы хотите взять ссылку в качестве аргумента, вы должны сказать об этом и, возможно, перегрузить шаблон соответствующим образом. Изменение ссылочной позиции обычно не будет тем, что вы хотите (хотя вы можете удалить ссылочную часть выведенного типа). Как правило, концепции, реализуемые ссылочным типом, весьма отличаются от концепций, используемых для значений. Также обратите внимание, что r
- это просто другое имя для x
с целью определения типа и разрешения перегрузки.
В C ++ 2011 вы можете попросить компилятор сохранить немного больше информации о типе: при выводе типа в шаблоне с использованием ссылочной нотации rvalue (т. Е. T&&
для аргумента шаблона T
), тип будет выведен в быть ссылкой с cv-qualuiiers, применяемыми соответствующим образом для lvalues, и типом значения для non-lvalues. То есть выводимый тип существенно зависит от того, является ли аргумент временным объектом (или, по крайней мере, сделан так, чтобы он выглядел как единое целое).