关于 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::*>
被取出来吗?
最佳答案
第二个操作数(即指向成员的指针)的值类别对于指向成员的指针运算符并不重要。
因此 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;
}
作者可能复制并粘贴了模板“template”,并且没有费心删除不必要的转发。
关于c++ - cppreference 的 result_of 示例中不必要的 std::forward 使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27348499/