按值或 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 通用参考传递函子? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

在 C++11 中按值或引用使用 lambda 默认捕获的缺点?

C# 传递参数(值或引用)?

ECMAScript 中所以函数的参数都是按值传递

R按值传递或按引用传递[重复]

复制赋值运算符应该通过 const 引用还是按值传递?

属性 - 按值或参考?