当我有看起来像这样的代码:完美转发和模板
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