Являются ли параметры шаблона функции T& и T&& неоднозначными?
Рассмотрим эти две перегрузки:
template <typename T> void foo(T &) {}
template <typename T> void foo(T &&) {}
Они потенциально неоднозначны?
Следующий код компилируется с Clang 3.4, но не работает с GCC 4.8, который сообщает о перегрузках (первый с T = int
второй с T = int&
) неоднозначны.
int main()
{
int n = 10;
foo(n);
}
Я понимаю, что "привязка к ссылке" является "точным соответствием" с точки зрения разрешения перегрузки, поэтому я полагаю, что вопрос сводится к тому, является ли одно из выводов T = int
/T = int&
предпочтительнее других, или если они одинаково хороши.