我有重载方法:
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);
方法。
答案 0 :(得分:5)
只要您T&& v
(其中T
是模板参数),您就拥有所谓的universal reference。它不仅绑定到rvalues,而且也绑定到左值。这是一个贪心模板。这将需要它可以得到的任何东西,并没有回馈任何东西。
当涉及贪婪模板时出现重载是一个错误的想法,除非您确切知道自己在做什么。
对于通用引用,通常不需要特殊情况左值与右值。只需std::forward<T>(v)
传播参数和值类别。
答案 1 :(得分:1)
无需修复。您的代码符合C ++ 11标准。这些案例的标准说非通用参考模板是“更专业化”的,它将优先考虑。
所以你的电话应该选择第一个模板。如果删除第一个模板,则会使用第二个模板。它与此类似
// "universal" with respect to const qualification
template<typename T>
void f(T &);
template<typename T>
void f(const T&);
现在这将调用第二个模板实例,因为虽然两个实例都有const int&
作为参数类型,但第二个实例与更专业的函数模板相关联。
const int a = 0;
f(a);
在你的情况下也一样。请注意,它是“完整的”,因为它适用于const和lvalue / rvalue的所有组合
const U&
作为参数,但T&
一个更专业,因此通过部分排序采用。T&
一个U&
作为参数,T&&
也有U&
作为参数,但T&
一个更专业,所以它被采用通过部分排序。 T&
一个const U&
作为参数,T&&
一个const U&&
作为参数。右值引用优选用于在左值引用上绑定rvalue。因此T&&
仅通过重载决策来获取。T&
一个U&
作为参数。非const左值引用不能绑定到rvalues。因此,T&&
一个U&&
类型,仅通过重载决策选择。