【发布时间】:2012-02-01 10:35:02
【问题描述】:
在我的 C++ 应用程序(使用 Visual Studio 2010)中,我需要存储一个 std::function,如下所示:
class MyClass
{
public:
typedef std::function<int(int)> MyFunction;
MyClass (Myfunction &myFunction);
private:
MyFunction m_myFunction; // Should I use this one?
MyFunction &m_myFunction; // Or should I use this one?
};
如你所见,我在构造函数中添加了函数参数作为引用。
但是,在我的类中存储函数的最佳方式是什么?
- 我可以将函数存储为引用,因为 std::function 只是一个函数指针,并且函数的“可执行代码”保证会保留在内存中吗?
- 如果传递了 lambda 并且调用者返回,我是否必须制作副本?
我的直觉是存储引用(甚至是 const 引用)是安全的。我希望编译器在编译时为 lambda 生成代码,并在应用程序运行时将此可执行代码保存在“虚拟”内存中。因此可执行代码永远不会被“删除”,我可以安全地存储对它的引用。但这真的是真的吗?
【问题讨论】:
-
std::function包含的内容无关紧要...如果您保存对一个的引用,而被引用的那个超出范围,您就会遇到问题。 -
@Alex 包装函数对象的类型,lambda 或其他,没有区别。与可以形成引用(包括指针)的任何对象完全相同的原则适用于此处。因此,如果您稍后尝试调用 (A) 一个
std::function通过std::reference_wrapper传递了一个函子,被引用的函子的生命周期已经结束,和/或 (B) 对std::function的引用,其中被引用者的生命周期已经结束。
标签: c++ lambda std-function