在grppreference的result_of中使用不必要的std :: forward

时间:2014-12-07 22:14:02

标签: c++ c++11

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::*>吗?

2 个答案:

答案 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

我通过更改两个受影响的重载来修复错误,以便通过值获取指向成员的指针;我很犹豫要完全退出这个改变。任何人都可以证明编辑引用的问题吗?