Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/126.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 目标-C++;11-为什么可以';我们不能给lambda分配一个块吗?_C++_Objective C_Lambda_C++11_Objective C++ - Fatal编程技术网

C++ 目标-C++;11-为什么可以';我们不能给lambda分配一个块吗?

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

所以,我刚升级到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::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,…)
      调用。由于块支持“调用操作符”,它也可以由
      std::function
      持有。但是注意Objy-C和C++遵循不同的内存管理方案,所以在一个代码中存储一个块在很长一段时间内的STD::函数< />可能会引起悬空引用。李>

    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
    实例。