std::reference_wrapper::operator()
执行在某些情况下,有点超出了直接的函数调用会“神奇”。其效果被指定为(引用N4296 [refwrap.invoke]):
template <class... ArgTypes>
result_of_t<T&(ArgTypes&&...)>
operator()(ArgTypes&&... args) const;
返回:INVOKE(get(), std::forward<ArgTypes>(args)...)
。 (20.9.2)
其中get()
返回对reference_wrapper
包装的参考。 INVOKE
在20.9.2 [func.require]描述:
定义INVOKE(f, t1, t2, ..., tN)
如下:
(1.1) - (t1.*f)(t2, ..., tN)
时f
是一个指针,指向类的成员函数T
和t1
是T
类型的对象或对T
类型的对象的引用或对从T
派生的类型的对象的引用;
(1.2) - ((*t1).*f)(t2, ..., tN)
f
时是一个指向类T
和t1
不是在前面的项中描述的类型中的一种的一个成员函数;
(1.3) - t1.*f
时N == 1
和f
是一个指针,指向类的成员数据T
和t1
是T
类型的对象或T
类型的对象或派生来的类型的对象的基准的基准来自T
;
(1.4) - (*t1).*f
时N == 1
和f
是一个指向类T
和t1
不是在前面的项中描述的类型之一的构件数据;
(1.5) - f(t1, t2, ..., tN)
在所有其他情况下。
主叫ref(f)
而不是简单地f
的结果是,指针到成员函数和指针到成员的数据可以被“称为”与适当的对象指针/参考作为参数。例如,
struct A { void foo(); };
struct B : A {};
struct C : B {};
for_each_arg(&A::foo, A{}, B{}, C{}, std::make_unique<A>());
将调用foo
上A
,B
和C
临时对象并在unique_ptr
(DEMO)保持的物体。为什么宁愿使用ref(f)
而不是f
显然将取决于使用的上下文for_each_arg
。
这是不必要的。 https://twitter.com/ericniebler/status/559798611991879684 – inf 2015-01-26 21:22:44