手动为rvalue或左值类型选择重载函数

时间:2012-11-30 16:23:40

标签: c++ templates c++11 rvalue-reference

我有重载方法:

    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);方法。

2 个答案:

答案 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 lvalue 。两者都有const U&作为参数,但T&一个更专业,因此通过部分排序采用
  • 非常数左值,您的情况。 T&一个U&作为参数,T&&也有U&作为参数,但T&一个更专业,所以它被采用通过部分排序
  • const rvalue T&一个const U&作为参数,T&&一个const U&&作为参数。右值引用优选用于在左值引用上绑定rvalue。因此T&&仅通过重载决策来获取
  • 非const rvalue T&一个U&作为参数。非const左值引用不能绑定到rvalues。因此,T&&一个U&&类型,仅通过重载决策选择