c++ - cppreference 的 result_of 示例中不必要的 std::forward 使用

标签 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::*>被取出来吗?

最佳答案

第二个操作数(即指向成员的指针)的值类别对于指向成员的指针运算符并不重要。 因此 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/

相关文章:

c++ - 将帧缓冲区从 Swift 传递到 C++ 的正确方法是什么?

c++ - C++11 的三规则变成五规则?

c++ - 检查所有 std::tuple 元素是否满足条件+设计问题

c++ - Windows SChannel 支持 CURL SFTP 吗?

c++ - Sqlite3/C++执行DELETE语句不改变db大小

c++ - 计算文件中的偶数行数

c++ - 一些 googletest 宏的覆盖分析显示分布在多行时覆盖不完整 - 为什么?

c++ - std::shared_ptr use_count() 值

当 base 不在 [2,36] (GCC) 中时,C++11 std::stoi 静默失败

c++ - Clang 无法使用 libstdc++ 识别 std::shared_ptr