C++ 目标-C++;11-为什么可以';我们不能给lambda分配一个块吗?
所以,我刚升级到Xcode 4.4,我在变更日志中注意到: Apple LLVM编译器支持其他C++11功能,包括lambdas 太棒了!所以我开始编写代码,我发现了一些东西:C++ 目标-C++;11-为什么可以';我们不能给lambda分配一个块吗?,c++,objective-c,lambda,c++11,objective-c++,C++,Objective C,Lambda,C++11,Objective C++,所以,我刚升级到Xcode 4.4,我在变更日志中注意到: Apple LLVM编译器支持其他C++11功能,包括lambdas 太棒了!所以我开始编写代码,我发现了一些东西: lambda可分配给Objective-C区块: void (^block)() = []() -> void { NSLog(@"Inside Lambda called as block!"); }; block(); std::function可以容纳Objective-C块: std::fu
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();
为什么会这样?鉴于我们在上面看到的情况,这两者在语义上是否应该是等价的?lambda有自己的、实现定义的类型,这些类型特定于每个lambda。以下代码也是一个错误:
auto l1=[](){return 1;}
auto l2=[](){return 2;}
l1=l2; //Error
std::function
是一个包装器,设计用于保存任何可调用类型;您应该使用它来保存可能属于不同类型的可调用项。C++11的lambda的复制赋值运算符被显式禁用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;
}
#包括
#包括
int main(){
自动lambda1=[]()->void{printf(“lambda1!\n”);};
lambda1=lambda1;//错误:使用已删除的函数“main()::&main():::运算符=(const main()::&)”
返回0;
}
std::function
可以容纳Objective-C块
可以保存任何类型,这些类型可以作为std::function
调用。由于块支持“调用操作符”,它也可以由f(a,b,c,…)
持有。但是注意Objy-C和C++遵循不同的内存管理方案,所以在一个代码中存储一个块在很长一段时间内的STD::函数< />可能会引起悬空引用。李>std::function
lambda可分配给Objective-C区块:
void (^block)() = []() -> void {
NSLog(@"Inside Lambda called as block!");
};
block();
- 责怪2:)。不过,它还没有被记录在案
1:C++11§5.1.2/19: 与lambda表达式关联的闭包类型具有已删除(8.4.3)的默认构造函数和已删除的复制赋值运算符
2:+1好消息,好问题-迫不及待地想了解更多关于这个主题的信息。还需要注意的是:非捕获lambda(如本例中的lambda)可以在赋值时隐式转换为函数指针类型–例如使用fp\u t=std::add\u pointer\t;fp_t fp=l1代码>在这种情况下有效。如果lambda被声明为正在捕获(比如说
intx=42;auto l3=[&x](){return x;}
),则没有等效的函数指针类型–保存捕获lambda需要一个std::function
实例。