功能模板无法识别左值

LxL*_*LxL 5 c++ templates rvalue lvalue c++11

我的代码有问题

这是它的简化版本:

#include <iostream>
class A
{
public :
    template <class T>
    void func(T&&)//accept rvalue
    {
        std::cout<<"in rvalue\n";
    }

    template <class T>
    void func(const T&)//accept lvalue
    {
        std::cout<<"in lvalue\n";
    }
};
int main() 
{    
    A a;
    double n=3;
    a.func(n);
    a.func(5);
}
Run Code Online (Sandbox Code Playgroud)

我希望输出为:

in lvalue
in rvalue
Run Code Online (Sandbox Code Playgroud)

但它是

in rvalue 
in rvalue
Run Code Online (Sandbox Code Playgroud)

为什么?!

Jar*_*d42 7

template <class T> void func(T&&)通用参考 转发参考.

要测试你想要的东西,试试:( 实例)

template <typename T>
class A
{
public:
    void func(T&&)//accept rvalue
    {
        std::cout<<"in rvalue\n";
    }
    void func(T&)//accept lvalue
    {
        std::cout<<"in lvalue\n";
    }
};

int main() 
{    
    A<double> a;
    double n = 3;
    a.func(n);
    a.func(5.);
}
Run Code Online (Sandbox Code Playgroud)


Ker*_* SB 6

要建立在Jarod42的精确答案上,如果你想保持主要功能模板的设计,你可以根据通用引用参数的推导类型来决定:

#include <iostream>
#include <type_traits>

struct A
{
    template <typename T>                 // T is either U or U &
    void func(T && x)
    {
        func_impl<T>(std::forward<T>(x));
    }

    template <typename U>
    void func_impl(typename std::remove_reference<U>::type & u)
    {
        std::cout << "lvalue\n";
    }

    template <typename U>
    void func_impl(typename std::remove_reference<U>::type && u)
    {
        std::cout << "rvalue\n";
    }
};
Run Code Online (Sandbox Code Playgroud)