函数模板无法识别左值
function template does not recognize lvalue
我的代码有问题
这是它的简化版本:
#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);
相关文章:
- 当函数模板参数是具有默认参数的类模板时,函数模板参数的推导如何执行
- 将重载的成员函数传递给函数模板
- C++17中函数模板中的静态数组初始化(MSVC 2019)
- 为什么 gcc 和 clang 为函数模板的实例化生成不同的符号名称?
- 具有常量引用参数的函数模板专用化
- std::span<const T> 作为函数模板中的参数
- 如何编写一个完美的缩写函数模板?
- 仅在函数模板中为那些定义了函数的类型执行函数
- 如何在C++中伪造虚拟可变参数函数模板?
- 以下代码中的函数模板有什么问题?
- 在 C++20 中是否不再允许在 std 中对程序定义类型的函数模板进行专用化?
- 将显式实例化的函数模板与转换匹配
- 使用定义函数模板别名
- 函数模板返回类型
- C++有什么方法可以在既不调用函数模板也不提供其模板参数的情况下引用函数模板?
- C++ std::functional 中的可变参数函数模板
- 单行函数模板 c++ 的内联性保证
- MSVC 无法识别继承模板类的模板类的"直接"基类构造函数
- 试图使用int []作为打字模板,编译器未识别函数最小的原型中的参数
- 函数模板无法识别左值