c – 具有通用引用的成员函数模板不接受左值
发布时间:2020-12-16 09:56:36 所属栏目:百科 来源:网络整理
导读:我一直在尝试使用模板成员函数在我的类中设置一个值.我想使用通用参考,以便我可以接受任何正确类型的变体(例如T,T,T,const T,const T,const T) 但是,似乎我的成员函数只接受rvalues,而不像接受通用引用的自由函数. template typename Tclass Foo{public: voi
我一直在尝试使用模板成员函数在我的类中设置一个值.我想使用通用参考,以便我可以接受任何正确类型的变体(例如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; } 解决方法
在给出的代码中,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仍然是一个函数模板,因此它仍然接受通用引用. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |