我不知道爲什麼編譯器會給我關於模板實例化的警告。std :: forward帶有模板化重載函數
那是一個代碼段它運行得很好並正確輸出左值/右值:
//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;
}
給出模板實例警告,(當我其清晰T應當的std :: string),以及控制檯輸出第一右值,而不是2倍左值的。
我在做什麼錯了?
適合我。 http://coliru.stacked-crooked.com/a/fc00c140c9a8e208 – erip
'T &&'是一個轉發引用,即如果'T'是一個類型模板參數,它不再是一個常規的右值引用 –