当我们有一个这样的功能模板时:
template <class T>
void push_back(T&& type)
{
}
这样称呼是完全合法的:
push_back(1);
并这样:
int i = 0;
push_back(i);
但是,当我有一个模板类时:
template <class Type>
class List
{
public:
void push_back(Type&& value)
{
}
};
我不能这样称呼它:
List<int> list_int;
int i = 42;
list_int.push_back(i);
因为我得到了以下帮助:
error: rvalue reference to type 'int' cannot bind to lvalue of type 'int'
有人可以向我解释为什么吗?
答案 0 :(得分:3)
在:
template <class T>
void push_back(T&& type)
T&& type
是forwarding reference,绑定到任何value category。
位置:
template <class Type>
class List
{
public:
void push_back(Type&& value)
{
}
};
Type&& value
是一个r值引用,仅绑定到r值。
要使List::push_back
使用转发引用push_back
必须成为功能模板:
template <class Type>
class List
{
public:
template<class U>
void push_back(U&& value)
{
}
};
或者,在C ++ 20中,使用auto&&
参数类型:
template <class Type>
class List
{
public:
void push_back(auto&& value)
{
}
};