C++ std::ref在此函数中有什么用途?
为什么人们更喜欢调用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&&
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;//不要绑定到临时对象。
@Barrystd::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>());