【问题标题】:Lambda ExpressionsLambda 表达式
【发布时间】:2011-05-31 11:28:41
【问题描述】:

ISO 草案 n3290 第 5.1.2 节第 19 点中的一点:

与 a 关联的闭包类型 lambda 表达式已删除 (8.4.3) 默认构造函数和一个 删除了复制赋值运算符。它 有一个隐式声明的副本 构造函数(12.8)并且可能有一个 隐式声明的移动构造函数 (12.8)。 [注:复制/移动 构造函数隐式定义在 与其他任何隐含的方式相同 声明的复制/移动构造函数将 被隐式定义。 ——尾注]

任何人都可以......请举一些例子来理解这一点吗?

是否有任何机会/方法来检查 Closure 对象(类型)?

【问题讨论】:

    标签: c++ c++11 lambda


    【解决方案1】:

    与 lambda 表达式关联的闭包类型有一个已删除的 (8.4.3) 默认构造函数

    int main() {
        auto closure = [](){};
        typedef decltype(closure) ClosureType;
    
        ClosureType closure2;   // <-- not allowed
    
        return 0;
    }
    

    和一个已删除的复制赋值运算符。它有一个隐式声明的复制构造函数 (12.8),并且可能有一个隐式声明的移动构造函数 (12.8)。

    #include <utility>
    
    int main() {
        auto closure = [](){};
        typedef decltype(closure) ClosureType;
    
        ClosureType closure2 = closure;   // <-- copy constructor
        ClosureType closure3 = std::move(closure);  // <-- move constructor
        closure2 = closure3;              // <-- copy assignment (not allowed)
    
        return 0;
    }
    

    【讨论】:

    • 感谢您的回答..有没有办法/机会解释..这一点..就类示例而言
    • 我相信这是格式良好的:auto closure = []{}; decltype(closure) c{};。不过,C++0x rev1 的缺陷报告可能会改变这一点。
    【解决方案2】:
    struct LambdaExample{
      // deleted operations = not allowed
      LambdaExample() = delete;
      LambdaExample& operator=(LambdaExample const&) = delete;
    
      // generated by the compiler:
      LambdaExample(LambdaExample const& other);
      LambdaExample(LambdaExample&& other);
    
      // anything else a lambda needs
    };
    

    对于第二个问题,如果您的意思是可以研究实施,那么不,不可能。它是由编译器即时创建的。如果您要获取 lambda 的类型,请确定:

    auto l = [](){};
    typedef decltype(l) closure_type;
    

    【讨论】:

    • 是的,闭包 obj 类型是由编译器即时创建的。至少有机会检查它是否存在
    • @user:“存在”是什么意思?
    猜你喜欢
    • 1970-01-01
    • 2013-07-02
    • 2014-04-08
    • 2013-09-30
    • 2010-11-12
    • 2019-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多