Я экспериментирую с совершенной функцией пересылки C++ 11. Компилятор Gnu g ++ сообщает о проблеме неоднозначности привязки функциональных параметров (ошибка показана после исходного кода ниже). Мой вопрос: Почему это так, как после процесса связывания функции-параметра. Я не вижу двусмысленности. Мое рассуждение таково: звоните в tf (a) в main() привязывается к tf (int &) с a является lvalue. Тогда функция Tf пересылает эталонное-значение INT & функционировать г, следовательно, функция недействительного г (интермедиат & а) должен быть однозначно вызван. Таким образом, я не вижу причины двусмысленности. Ошибка исчезает, когда перегруженная функция g (int a) удаляется из кода. Это странно, так как g (int a) не может быть кандидатом для привязки с int & a.Идеальная пересылка и двусмысленность привязки функциональных параметров
Вот мой код:
void g(int &&a)
{
a+=30;
}
void g(int &a)
{
a+=10;
}
void g(int a) //existence of this function originates the ambiguity issue
{
a+=20;
}
template<typename T>
void tf(T&& a)
{
g(forward<T>(a));;
}
int main()
{
int a=5;
tf(a);
cout<<a<<endl;
}
Компиляция г ++ -std = C++ 11 perfectForwarding.cpp сообщает следующие ошибки:
perfectForwarding.cpp: In instantiation of ‘void tf(T&&) [with T = int&]’:
perfectForwarding.cpp:35:7: required from here
perfectForwarding.cpp:24:3: error: call of overloaded ‘g(int&)’ is ambiguous
perfectForwarding.cpp:24:3: note: candidates are:
perfectForwarding.cpp:6:6: note: void g(int&&) <near match>
perfectForwarding.cpp:6:6: note: no known conversion for argument 1 from ‘int’ to ‘int&&’
perfectForwarding.cpp:11:6: note: void g(int&)
perfectForwarding.cpp:16:6: note: void g(int)
Это гораздо лучший ответ, чем мой, спасибо, Cassio :) –
Действительно более полный ответ, спасибо! –