Suppose I have some ref counted class Foo with the private member mBar. Normally with a lambda expression, you can easily access the private members by passing the this pointer:
void Foo::pokeBar() { nsCOMPtr<nsIRunnable> r = NS_NewRunnableFunction[this] () -> void { mBar.poke(); }); NS_DispatchToMainThread(r); } But obviously the Foo object could get released before the dispatch completes. I could capture an nsRefPtr to this in the lambda: nsresult Foo::pokeBar() { nsRefPtr<Foo> self = this; nsCOMPtr<nsIRunnable> r = NS_NewRunnableFunction[self] () -> void { self->mBar.poke(); }); NS_DispatchToMainThread(r); } But now it won't let me access the private members. I can add *both* and it appears to work (at least on gcc, haven't tested clang/msvc): nsresult Foo::pokeBar() { nsRefPtr<Foo> self = this; nsCOMPtr<nsIRunnable> r = NS_NewRunnableFunction[this, self] () -> void { self->mBar.poke(); }); NS_DispatchToMainThread(r); } Since I'm using the self pointer, I don't see the compiler optimizing the capture of it out, and the addition of "this" opens up the scope to what I need. (Although maybe explicitly using self is overkill? Can I eliminate that safely?) But this is my first time using lambda expressions in C++, so I'm not entirely sure if there is a good reason for *not* doing what I am above :). In the few examples of lambdas that I found in our code, it looks like we just made everything public. My other attempts at fixing this was to make an nsRefPtr to mBar inside Foo::pokeBar and pass *that* to the lambda, which is fine but my real world uses have multiple private members and functions I would like to access :). Is there anybody who can chime in on how best to use lamdas with private members? The only guidance I could find on the wiki was this, which I think I am following (e.g. don't use [=] to suck down everything): https://developer.mozilla.org/en-US/docs/Mozilla/C++_Portability_Guide#Use_C.2B.2B_lambdas.2C_but_with_care Thanks, Andrew _______________________________________________ dev-platform mailing list dev-platform@lists.mozilla.org https://lists.mozilla.org/listinfo/dev-platform