Я понятия не имею, почему компилятор дает мне предупреждения о экземплярах шаблонов.std :: forward с templated overloaded function
То есть кусок кода, который работает просто отлично, и выводит Lvalue/RValue правильно:
//template<typename T>
void overloaded(const /*T*/std::string& in)
{
std::cout << "lvalue" << std::endl;
}
//template<typename T>
void overloaded(/*T*/std::string&& in)
{
std::cout << "rvalue" << std::endl;
}
template<typename T>
void pass(T&& in)
{
overloaded(std::forward<T>(in));
}
int main()
{
std::string a;
pass(a);
pass(std::move(a));
getchar();
}
Но мне нужно, чтобы использовать его с шаблонного типа. Так изменения «перегруженные» функции
template<typename T>
void overloaded(const T& in)
{
std::cout << "lvalue" << std::endl;
}
template<typename T>
void overloaded(T&& in)
{
std::cout << "rvalue" << std::endl;
}
дает шаблон Instantiations предупреждения, (когда мне его ясно T должен быть StD :: string), и консоль выводит RValue 2 раза вместо Lvalue первого.
Что я делаю неправильно?
Работы для меня. http://coliru.stacked-crooked.com/a/fc00c140c9a8e208 – erip
'T &&' является ссылкой для пересылки, т. е. если 'T' является параметром шаблона типа, он больше не является регулярной ссылкой на rvalue –