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

Kla*_*aus 1 c++ templates rvalue-reference c++11

我有重载方法:

    template<typename AnyType>
    void AnyFunc(AnyType &t);

    template<typename AnyType>
    void AnyFunc(AnyType &&t);
Run Code Online (Sandbox Code Playgroud)

我有一个调用程序,它持有一个指针,并希望使用其中一个函数:

    MyType* ptr=new MyType();
    AnyFunc(*ptr);
Run Code Online (Sandbox Code Playgroud)

最后一行遇到编译错误:AnyFunc的模糊重载

如何选择我需要的功能?简单的例子是使用:

    AnyFunc(std::move(*ptr)); 
Run Code Online (Sandbox Code Playgroud)

选择void AnyFunc(AnyType &&t);但这不是我想要的.我需要这个 void AnyFunc(AnyType &t);方法.

Xeo*_*Xeo 5

任何时候T&& v(T模板参数在哪里),你都有一个所谓的通用引用.它不仅绑定到右值,但给左值.这是一个贪婪的模板.这需要它可以获得的任何东西,并且什么都不给.

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

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