假设我有:
template<class T> struct NodeBase { T value; NodeBase(T &&value) : value(value) { } };
我从它继承:
template<class T> struct Node : public NodeBase<T> { Node(T &&value) : NodeBase( WHAT_GOES_HERE (value)) { } };
WHAT_GOES_HERE应该是std :: move或std :: forward< T>?为什么?
解决方法
由于在Node< T>的构造函数的实现中,T是否是普通类型(即不是参考)或引用是未知的,
std::forward<T>(value)
适合.
只要不知道T&&&&&&绑定到rvalue或lvalue.在这种情况下,因为在构造函数中,我们不知道T&&相当于U&&对于某些普通型U,或等同于U& &安培;&安培;.
在使用std :: forward或在不同时间确定的函数调用(例如在您的示例中,在实例化Node模板时确定T的情况下)推导T是否无关紧要.
std :: forward< T>(value)将以与调用者直接调用基类构造函数相同的方式调用继承的构造函数.也就是说,当value是一个左值时,它会将它称为一个左值,当值是一个右值时,它将被称为右值.
原文地址:https://www.jb51.cc/c/112800.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。