模板类中的函数与模板函数

时间:2019-09-18 14:53:19

标签: c++11 templates

当我们有一个这样的功能模板时:

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'

有人可以向我解释为什么吗?

1 个答案:

答案 0 :(得分:3)

在:

template <class T>
void push_back(T&& type)

T&& typeforwarding 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)
 {
 }
};