Ответ 1
Оператор lambda copy-присваивания С++ 11 явно отключен 1. Это не вопрос "семантически эквивалентный". Он даже не может вернуть себе. Не говоря уже о неродственном типе.
#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
может содержать блок Objective-C.
-
std::function
может содержать любые типы, которые могут быть вызваны какf(a,b,c,...)
. Поскольку блоки поддерживают "оператор вызова", его также можно удерживать с помощьюstd::function
. Но обратите внимание, что Objective-C и С++ следуют различным схемам управления памятью, поэтому сохранение блока вstd::function
в течение длительного времени может вызвать зависание ссылки.
Lambdas можно назначить блокам Objective-C:
- Обвинение SAHChandler 2:). Однако он еще не задокументирован.
1: С++ 11 §5.1.2/19:
Тип замыкания, связанный с lambda-выражением, имеет удаленный (8.4.3) конструктор по умолчанию и оператор делегирования удаленной копии.
2: http://llvm.org/viewvc/llvm-project?view=rev&revision=150620