在std::result_of
页面上有一个可能的实施部分。它有这段代码:
template <class Base, class T, class Derived>
inline auto INVOKE(T Base::*&& pmd, Derived&& ref) ->
decltype(forward<Derived>(ref).*forward<T Base::*>(pmd)) {
return forward<Derived>(ref).*forward<T Base::*>(pmd);
}
我认为不必要的部分是使用std::forward<T Base::*>
。 T Base::*&& pmd
的签名不使用Derived&& ref
之类的“通用引用”。因此,它总是对指向成员的指针的右值引用。
我的理解是否正确?可以取出forward<T Base::*>
吗?
答案 0 :(得分:2)
第二个操作数的值类别(即指向成员的指针)对于指向成员的运算符并不重要。
因此forward
确实是多余的,重载可以重写为
template <class Base, class T, class Derived>
inline auto INVOKE(T Base::*&& pmd, Derived&& ref) ->
decltype(forward<Derived>(ref).*pmd) {
return forward<Derived>(ref).*pmd;
}
作者可能会复制并粘贴模板“模板”,并且不打算删除不必要的转发。
答案 1 :(得分:0)
The edit from 2014-07-27 changed the pointer-to-member argument of that particular INVOKE
overload from PMD&& pmd
to T Base::*&& pmd
评论“修复ObjectRef
有一个重载的间接运算符返回自身时的错误。”我不确定评论所引用的错误,因为.*
不可重载,但确实introduce a new bug by requiring the pointer-to-member to be an rvalue。
我通过更改两个受影响的重载来修复错误,以便通过值获取指向成员的指针;我很犹豫要完全退出这个改变。任何人都可以证明编辑引用的问题吗?