當我有看起來像這樣的代碼:完美轉發和模板
template<class T>
void f_(const T& arg)
{
cout << "void f(const T& arg): Cannot modify\n";
}
template<class T>
void f_(T&& arg)
{
cout << "void f(T&& arg): Can modify\n";
}
,並在主我把它叫做:
int main()
{
MemoryBlock block;
f_(block);
f_(MemoryBlock());
return 0;
}
輸出是:
「無效F(T & & arg):可以修改\ n「;
「void f(T & & arg):可以修改\ n」;
但當我這個代碼改爲不通用,即不是函數模板,我會定期的功能,
void f(const MemoryBlock&)
{
cout << "In f(const MemoryBlock&). This version cannot modify the parameter.\n";
}
void f(MemoryBlock&&)
{
cout << "In f(MemoryBlock&&). This version can modify the parameter.\n";
}
輸出更加「直觀」:
「駐f (const MemoryBlock &)。該版本不能修改參數。
「In f(MemoryBlock & &)。此版本可以修改參數。
它在我看來,只有通過將功能從模板更改爲非模板,才能完全改變右值引用的演繹規則。
如果有人會向我解釋這個問題,那真是太棒了。
你通過誤導以爲模板參數'最好的選擇T'映射到'MemoryBlock'。 – Walter
有趣的是,你在標題中有「完美轉發」,但你根本沒有做任何轉發。 – Mehrdad