C++ std::ref在此函数中有什么用途?

C++ std::ref在此函数中有什么用途?,c++,c++11,c++14,C++,C++11,C++14,为什么人们更喜欢调用std::ref而不是根本不调用它 template<class F, class...Ts> F for_each_arg(F f, Ts&&...a) { return (void)initializer_list<int>{(ref(f)((Ts&&)a), 0)...}, f; // why not return (void)initializer_list<int>{(f((Ts&&

为什么人们更喜欢调用std::ref而不是根本不调用它

template<class F, class...Ts> F for_each_arg(F f, Ts&&...a) {
  return (void)initializer_list<int>{(ref(f)((Ts&&)a), 0)...}, f;
  // why not return (void)initializer_list<int>{(f((Ts&&)a), 0)...}, f;
}
每个参数的模板F(F,Ts&…a){ 返回(void)初始值设定项列表{(ref(f)((Ts&&)a),0)…},f; //为什么不返回(void)初始值设定项{(f((Ts&&)a),0)…},f; } 在某些情况下执行的“魔法”比直接函数调用要多。其效果指定为(引用N4296[refwrap.invoke]):


将调用
A
B
C
临时对象和
unique\u ptr
()中保存的对象上的
foo
。为什么人们更喜欢使用
ref(f)
而不是
f
显然取决于人们对每个参数使用
的上下文,这是不必要的。有趣的是,
std::reference\u wrapper
的另一个神奇功能。想知道为什么埃里克·尼布勒认为这是不必要的。@bamboon没有更多的上下文很难说。我推测,
ref()
增加了5个字符,并且为了代码高尔夫的目的,删除它会导致代码变短。为什么
auto f=std::ref(&A::foo)失败,但
自动f=&A::foo;auto f2=std::ref(f)
成功吗?@Barry因为
&A::foo
是一个右值,并且
reference\u包装器
有一个已删除的右值构造函数,以避免绑定到临时对象。标准在[refwrap]中的字面意思是:
reference\u wrapper(T&&)=delete;//不要绑定到临时对象。
@Barry
std::mem\u fn
没有那么长。
template <class... ArgTypes>
result_of_t<T&(ArgTypes&&... )>
operator()(ArgTypes&&... args) const;
struct A { void foo(); };
struct B : A {};
struct C : B {};
for_each_arg(&A::foo, A{}, B{}, C{}, std::make_unique<A>());