函数模板无法识别左值

function template does not recognize lvalue

本文关键字:识别 函数模板      更新时间:2023-10-16

我的代码有问题

这是它的简化版本:

#include <iostream>
class A
{
public :
    template <class T>
    void func(T&&)//accept rvalue
    {
        std::cout<<"in rvaluen";
    }
    template <class T>
    void func(const T&)//accept lvalue
    {
        std::cout<<"in lvaluen";
    }
};
int main() 
{    
    A a;
    double n=3;
    a.func(n);
    a.func(5);
}

我希望输出是:

in lvalue
in rvalue

但它是

in rvalue 
in rvalue

为什么?!

template <class T> void func(T&&)通用引用转发引用

要测试您想要的内容,请尝试:(实时示例)

template <typename T>
class A
{
public:
    void func(T&&)//accept rvalue
    {
        std::cout<<"in rvaluen";
    }
    void func(T&)//accept lvalue
    {
        std::cout<<"in lvaluen";
    }
};
int main() 
{    
    A<double> a;
    double n = 3;
    a.func(n);
    a.func(5.);
}

为了基于 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 << "lvaluen";
    }
    template <typename U>
    void func_impl(typename std::remove_reference<U>::type && u)
    {
        std::cout << "rvaluen";
    }
};

我认为惊喜来自模板参数的推导方式。如果你写:

a.func<double>(n);