为什么隐式"lambda to function pointer conversion"禁止"by reference"捕获静态成员?



C++11标准说(或者至少是我的版本,而不是最终版本):

没有lambda捕获的lambda表达式的闭包类型具有指向指针的公共非虚拟非显式常量转换函数具有与闭包相同的参数和返回类型的函数类型的函数调用运算符。

我理解为什么不能从有状态lambda中获取函数指针,因为函数指针本身不能容纳任何数据。

但是,当捕获的对象只是一个静态成员/静态变量时,就没有这样的限制,因为对捕获对象的引用可以在函数本身中硬连接。

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
    }
};

为什么不能在lambda是无状态的之后立即将其转换为函数指针?是我遗漏了什么,还是委员会忘记了这一点?

A::count根本不需要捕获。只需要捕获this和局部变量。具有静态存储持续时间的变量(例如,静态数据成员、命名空间范围变量或函数本地静态变量)不需要捕获,因为它们是"唯一的"。每个此类变量只有一个实例,因此不需要捕获对对象的引用。

如果从lambda中删除默认捕获(即,将[&]更改为[])并定义count,则编译时应该不会出错。(我已经验证了Visual C++2012 RC和g++4.5.1都接受该代码;我所做的唯一更改是移动count的内联初始化,因为这两个编译器都不支持C++11功能。)

最新更新