我有重载的方法:
template<typename AnyType>
void AnyFunc(AnyType &t);
template<typename AnyType>
void AnyFunc(AnyType &&t);
我有一个持有指针的调用方,并且想要使用以下功能之一:
MyType* ptr=new MyType();
AnyFunc(*ptr);
最后一行遇到编译错误:AnyFunc的模棱两可的重载
如何选择所需的功能?最简单的情况是使用:
AnyFunc(std::move(*ptr));
选择
void AnyFunc(AnyType &&t);
,但这不是我想要的。我需要void AnyFunc(AnyType &t);
方法。 最佳答案
任何时候只要拥有T&& v
(其中T
是模板参数),您就拥有一个所谓的universal reference。它不仅绑定(bind)到右值,而且还绑定(bind)到左值。这是一个贪婪的模板。它会花费一切可能得到的东西,并且什么也不会返回。
除非您完全知道自己在做什么,否则在涉及贪婪模板时进行重载是个坏主意。
使用通用引用,通常不需要使用特例左值与右值。只需std::forward<T>(v)
即可传播参数和值类别。