我有重载的方法:

    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)即可传播参数和值类别。

08-27 00:51