Search code examples
c++templatesc++11lvaluervalue

function template does not recognize lvalue


I have a problem in my code

Here is simplified version of it :

#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);
}

I expect the output to be :

in lvalue
in rvalue

but it is

in rvalue 
in rvalue

why ?!


Solution

  • template <class T> void func(T&&) is universal reference forwarding reference.

    To test what you want, try: (Live example)

    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.);
    }