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";
}
};