In my C++ application (using Visual Studio 2010), I need to store an std::function, like this:
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?
};
As you can see, I added the function argument as a reference in the constructor.
But, what is the best way to store the function in my class?
- Can I store the function as a reference since std::function is just a function-pointer and the ‘executable code’ of the function is guaranteed to stay in memory?
- Do I have to make a copy in case a lambda is passed and the caller returns?
My gut feeling says that it’s safe to store a reference (even a const-reference). I expect the compiler to generate code for the lambda at compile time, and keep this executable code in ‘virtual’ memory while the application is running. Therefore the executable code is never ‘deleted’ and I can safely store a reference to it. But is this really true?
std::functionis very much not just a function pointer. It’s a wrapper around an arbitrary callable object, and manages the memory used to store that object. As with any other type, it’s safe to store a reference only if you have some other way to guarantee that the referred object is still valid whenever that reference is used.Unless you have a good reason for storing a reference, and a way to guarantee that it remains valid, store it by value.
Passing by
constreference to the constructor is safe, and probably more efficient than passing a value. Passing by non-constreference is a bad idea, since it prevents you from passing a temporary, so the user can’t directly pass a lambda, the result ofbind, or any other callable object exceptstd::function<int(int)>itself.