我一直在尝试使用模板成员函数在我的类中设置一个值。我想使用通用引用,以便我可以接受任何正确类型的变体(例如T
,T&
,T&&
,const T
,const T&
, const T&&
)
但是,似乎我的成员函数只接受rvalues,而不像接受通用引用的自由函数。
template <typename T>
class Foo{
public:
void memberURef(T&& t){
val = std::forward<T>(t);
}
private:
T val;
};
template <typename T>
void freeURef(T&& t){
}
int main() {
int lval = 1;
const int clval = 1;
freeURef(lval); // fine
freeURef(clval); // fine
Foo<int> foo;
foo.memberURef(2);
foo.memberURef(lval); //error: cannot bind 'int' lvalue to 'int&&'
foo.memberURef(clval); //error: no matching function for call to 'Foo<int>::memberURef(const int&)'
return 0;
}
答案 0 :(得分:7)
在给出的代码中,Foo
被实例化为Foo<int>
。一旦发生这种情况,类模板就会被实例化,如下所示:
class Foo{
public:
void memberURef(int&& t){ // Uh oh!
val = std::forward<int>(t);
}
private:
int val;
};
注意成员函数不再是模板,因此不再接受通用引用,而是接受rvalue引用。为了创建一个接受通用引用的成员函数,需要修改Foo
类,如下所示:
template <typename T>
class Foo{
public:
template <typename L>
void memberURef(L&& t){
val = std::forward<L>(t);
}
private:
T val;
};
这样,memberURef
在实例化类模板后仍然是函数模板,因此它仍然接受通用引用。