所以,我刚刚升级到 Xcode 4.4,我在变更日志中注意到:
Apple LLVM 编译器支持其他 C++11 功能,包括 lambda
太棒了!所以我开始编码,并发现了一些事情:
-
Lambda 可以分配给 Objective-C 块:
void (^block)() = []() -> void {
NSLog(@"Inside Lambda called as block!");
};
block();
-
std::function
可以容纳一个 Objective-C 块:
std::function<void(void)> func = ^{
NSLog(@"Block inside std::function");
};
func();
-
我们不能将 Objective-C 块分配给 lambda:
auto lambda = []() -> {
NSLog(@"Lambda!");
};
lambda = ^{ // error!
NSLog(@"Block!");
};
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
可以容纳一个 Objective-C 块。
-
std::function
可以保存任何可以调用的类型f(a,b,c,...)
。由于块支持“调用运算符”,因此它也可以由std::function
。但请注意,Objective-C 和 C++ 遵循不同的内存管理方案,因此将块存储在std::function
长时间可能会导致悬空参考。
Lambda 可以分配给 Objective-C 块:
- Blame SAHChandler https://stackoverflow.com/questions/4148242/is-it-possible-to-convert-a-c0x-lambda-to-a-clang-block2 :). It's not documented yet, though.
1: C++11 §5.1.2/19:
与 a 关联的闭包类型lambda 表达式有一个删除的(8.4.3)默认构造函数和一个删除的复制赋值运算符。
2:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)