Objective-C++ 11 - Why can't we assign a block to a lambda? Objective-C++ 11 - Why can't we assign a block to a lambda? objective-c objective-c

Objective-C++ 11 - Why can't we assign a block to a lambda?


C++11's lambda's copy-assignment operator is explicitly disabled1. This is not a matter of "semantically equivalent". It can't even assign back to itself. Not to mention an unrelated type.

#include <cstdio>#include <type_traits>int main() {    auto lambda1 = []() -> void { printf("Lambda 1!\n"); };    lambda1 = lambda1;  // error: use of deleted function ‘main()::<lambda()>& main()::<lambda()>::operator=(const main()::<lambda()>&)’    return 0;}

std::function can hold an Objective-C block.

  • std::function can hold any types which can be invoked as f(a,b,c,...). Since blocks support "the invoke operator", it can also be held by a std::function. But notice that Objective-C and C++ follow different memory management scheme, so storing a block in a std::function for a long time may cause dangling reference.

Lambdas are assignable to Objective-C blocks:

  • Blame SAHChandler2 :). It's not documented yet, though.

1: C++11 §5.1.2/19:

The closure type associated with a lambda-expression has a deleted (8.4.3) default constructor and a deleted copy assignment operator.

2: http://llvm.org/viewvc/llvm-project?view=rev&revision=150620


Lambdas have their own, implementation-defined types which are specific to each lambda. The following code is also an error:

auto l1=[](){return 1;}auto l2=[](){return 2;}l1=l2; //Error

std::function is a wrapper which is designed to hold any callable type; you should use that to hold callables which may be of different types.