reference_wrapper 实施细节

reference_wrapper implementation details

此模板化 operator() 在 reference_wrapper 实现中如何工作

template <class T>
class reference_wrapper {
public:
  // types
  typedef T type;

  // construct/copy/destroy
  reference_wrapper(T& ref) noexcept : _ptr(std::addressof(ref)) {}
  reference_wrapper(T&&) = delete;
  reference_wrapper(const reference_wrapper&) noexcept = default;

  // assignment
  reference_wrapper& operator=(const reference_wrapper& x) noexcept = default;

  // access
  operator T& () const noexcept { return *_ptr; }
  T& get() const noexcept { return *_ptr; }

这里是:

  template< class... ArgTypes >
  typename std::result_of<T&(ArgTypes&&...)>::type
    operator() ( ArgTypes&&... args ) const {
    return std::invoke(get(), std::forward<ArgTypes>(args)...);
  }

为什么我们仍然需要 operator()?怎么运行的?

return内容是什么"result_of::type"?

什么是 (ArgTypes && ..) ??

调用(获取)???

这段代码看起来像是来自另一个星球的 C++:)

private:
  T* _ptr;
};

why do we need operator() anyway? how it works?

假设以下上下文

int foo(int bar)
{
    return bar + 5;
}

int main()
{
    std::reference_wrapper<int(int)> ref = foo;
    ref(5);
}

ref(5) 调用引用包装器的 operator()。如果它不在那里,它就不会工作,因为在这种情况下不会发生用户定义的转换。

operator() returns std::result_of<T&(ArgTypes&&...),这是存储的函数的 return 值,std::invoke 调用该函数并将参数转发给它。