1

我有重载的方法:

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

4

2 回答 2

5

只要你有T&& vT模板参数在哪里),你就有了一个所谓的通用引用。它不仅绑定到右值,绑定到左值。这是一个贪婪的模板。它会拿走它所能得到的任何东西,而不会回报任何东西。

涉及贪婪模板时重载是一个主意,除非您确切知道自己在做什么。

使用通用引用,通常不需要特殊情况的左值与右值。只会std::forward<T>(v)传播参数和值类别。

于 2012-11-30T16:36:04.530 回答
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 和左值/右值的所有组合

  • 常量左值。两者都有const U&as 参数,但T&一个更专业,因此采用偏序
  • 非常量 lvalue,你的情况。一个T&U&as 参数,T&&一个也有U&as 参数,但T&一个更专业,所以采用偏序
  • 常量右值T&一个const U&作为参数,一个T&&作为const U&&参数。右值引用优先用于绑定右值而不是左值引用。因此,T&&通过重载解决方案采用这一方案。
  • 非常量右值。一个T&U&作为参数。非常量左值引用不能绑定到右值。因此,只有重载决议才能选择T&&具有类型的那个。 U&&
于 2012-11-30T22:09:14.000 回答