功能模板无法识别左值

时间:2014-03-04 08:39:00

标签: c++ templates c++11 lvalue rvalue

我的代码中存在问题

以下是它的简化版本:

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

我希望输出为:

in lvalue
in rvalue

但它是

in rvalue 
in rvalue

为什么?!

3 个答案:

答案 0 :(得分:7)

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

要测试您想要的内容,请尝试:(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.);
}

答案 1 :(得分: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";
    }
};

答案 2 :(得分:2)

我认为惊喜来自推断模板参数的方式。如果你写的话,你会得到你所期望的:

a.func<double>(n);
相关问题