LxL*_*LxL 5 c++ templates rvalue lvalue c++11
我的代码有问题
这是它的简化版本:
#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);
}
Run Code Online (Sandbox Code Playgroud)
我希望输出为:
in lvalue
in rvalue
Run Code Online (Sandbox Code Playgroud)
但它是
in rvalue
in rvalue
Run Code Online (Sandbox Code Playgroud)
为什么?!
template <class T> void func(T&&)是通用参考 转发参考.
要测试你想要的东西,试试:( 实例)
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.);
}
Run Code Online (Sandbox Code Playgroud)
要建立在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";
}
};
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
205 次 |
| 最近记录: |