按值或 C++11 通用参考传递函子? [复制]
Posted
技术标签:
【中文标题】按值或 C++11 通用参考传递函子? [复制]【英文标题】:Pass functors by value or by C++11 Universal Reference? [duplicate] 【发布时间】:2012-12-06 12:04:40 【问题描述】:可能重复:Should templated functions take lambda arguments by value or by rvalue reference?
C++ 标准库函数按值接受函子(函数指针或函数对象)参数,如下所示:
template <typename F>
void apply(F func)
func();
...但是通过Universal Reference 传递函子不是更好吗?像这样:
template <typename F>
void apply(F&& func)
func();
这样您可以传递维护状态的函数对象,并在高阶函数返回后访问该(可能已修改)状态。
【问题讨论】:
模板在编译时展开/解析。他们如何知道编译时的状态? 请注意,对于第一个,您始终可以使用引用包装器来避免复制。 @Manoj R:我的意思是:你有一个函数对象变量 fn_obj,你调用 apply(fn_obj),然后你可以访问 fn_obj.state,它可能已经被调用修改了申请 【参考方案1】:这已经是一些算法的情况;例如在g++ 4.7.0
:
//stl_algo.h
template<typename _RandomAccessIterator, typename _UniformRandomNumberGenerator>
void
shuffle(_RandomAccessIterator __first, _RandomAccessIterator __last,
_UniformRandomNumberGenerator&& __g)
...
显然,对于诸如随机数生成器之类的东西来说,这是必不可少的。不过,我想这会随着时间的推移变得更加普遍。
【讨论】:
以上是关于按值或 C++11 通用参考传递函子? [复制]的主要内容,如果未能解决你的问题,请参考以下文章