Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 函数模板无法识别左值_C++_Templates_C++11_Lvalue_Rvalue - Fatal编程技术网

C++ 函数模板无法识别左值

C++ 函数模板无法识别左值,c++,templates,c++11,lvalue,rvalue,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&)//acce

我的代码有问题

以下是它的简化版本:

#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 rvalue 
in rvalue
为什么

模板void func(T&&)
是通用参考转发参考

要测试所需内容,请尝试:()

模板
甲级
{
公众:
void func(T&)//接受右值
{

std::cout我认为令人惊讶的是模板参数的推导方式。如果您编写以下代码,您将得到您所期望的结果:

a.func<double>(n);
a.func(n);

基于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";
    }
};
#包括
#包括
结构A
{
模板//T是U或U&
无效函数(T&&x)
{
func_impl(std::forward(x));
}
模板
void func_impl(typename std::remove_reference::type&u)
{

std::cout提示:除了
&
,这两个参数之间有什么区别?也许“universal reference”应该用引号括起来,因为它不是一个语言结构。@从技术上讲,它是一个语言结构,只是“universal reference”不是它的正式名称。不过,我很希望它是。它现在被称为“转发引用”。我想你的意思是“函数模板参数是如何推导的”。是的!我意识到我不完全理解这里发生了什么。我问了一个后续问题:
a.func<double>(n);
#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";
    }
};