为什么隐“拉姆达为一个函数指针转换”禁止静态成员的“参照”捕捉?(Why does the impl

2019-07-30 11:45发布

在C ++ 11标准说(或至少,我的版本 - 不是最后一个):

对于没有拉姆达捕获一个lambda表达式的闭合类型有一个公共非虚非显式const的转换功能函数指针具有相同的参数和返回类型为封闭类型的函数调用操作符。

我明白为什么它是不可能从一个状态拉姆达得到一个函数指针,因为函数指针本身不能包含任何数据。

但是,当所捕获的对象仅仅是静态成员/静态变量,不存在这样的限制,因为所捕获的对象的引用可以在函数本身是硬连线的。

struct A {
    static int count = 0;
    void foo() {
         static int bar = 0;
         auto fun = [&]()->void {
             count++;
             bar++;
         };
         void(*ptrFun)();
         ptrFun = fun; // forbidden by the quoted wording
    }
};

为什么不是总是可以将拉姆达只要前者是无状态的转换函数指针? 我缺少的东西或不委员会忘了这具体点吗?

Answer 1:

A::count并不需要在所有拍摄。 只有this和局部变量都需要被捕获。 具有静态存储持续时间(例如,静态数据成员,命名空间范围变量或函数局部静态变量)变量不需要被捕获,因为它们是“独一无二的”。 恰好有每个这样的变量的一个实例,所以对对象的引用并不需要被捕获。

如果您从拉姆达删除默认捕获(即,改变[&][]并定义count ,它应该编译没有错误。 (我已经验证这两个VISUAL C ++ 2012 RC和g ++ 4.5.1接受代码,我不得不做出的唯一的变化是移动的内联初始化count ,因为无论这些编译器的支持C ++ 11的功能呢。 )



文章来源: Why does the implicit “lambda to function pointer conversion” forbid the “by reference” capture of static members?
标签: c++ lambda c++11