在我的 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 并且调用者返回,我是否必须复制一份?
我的直觉告诉我,存储引用(甚至是常量引用)是安全的。我希望编译器在编译时生成 lambda 代码,并在应用程序运行时将此可执行代码保留在“虚拟”内存中。因此,可执行代码永远不会被“删除”,我可以安全地存储对它的引用。但这真的是真的吗?
由于 std::function 只是一个函数指针并且该函数的“可执行代码”保证保留在内存中,因此我可以将该函数存储为引用吗?
std::function
不仅仅是一个函数指针。它是任意可调用对象的包装器,并管理用于存储该对象的内存。与任何其他类型一样,存储引用是安全的only if您还有其他方法可以保证每当使用该引用时引用的对象仍然有效。
除非您有充分的理由存储引用,并且有方法保证其保持有效,否则请按值存储它。
经过const
对构造函数的引用是安全的,并且可能比传递值更有效。路过非const
引用是一个坏主意,因为它阻止您传递临时值,因此用户不能直接传递 lambda,即bind
,或任何其他可调用对象,除了std::function<int(int)>
itself.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)