当前位置:  开发笔记 > 编程语言 > 正文

具有空捕获列表的Lambda仍然能够从全局范围捕获对象?

如何解决《具有空捕获列表的Lambda仍然能够从全局范围捕获对象?》经验,为你挑选了1个好方法。

我有几个全局静态对象.别介意这些是Qt类,这与此事无关.

static const QStringList JpegFileExtensions = QString::fromLatin1(jpegExtensions).split(" ");
static const QStringList TiffFileExtensions = QString::fromLatin1(tiffExtensions).split(" ");
static const QStringList RawFileExtensions = QString::fromLatin1(rawExtensions).split(" ");
static const QStringList PngFileExtensions = QString::fromLatin1(pngExtensions).split(" ");

现在,我有另一个静态对象,它由一些函数初始化,它接受前面的对象并计算结果:

inline QString GetAllSupportedExtensions() {
   QStringList extensions = QStringList() << JpegFileExtensions << TiffFileExtensions << RawFileExtensions << PngFileExtensions;
   for (QString& item: extensions)
        item.remove("*.");

   return extensions;
}

static const QString AllSupportedExtensions = GetAllSupportedExtensions();

但由于这个GetAllSupportedExtensions函数没有在其他地方使用,我想摆脱它,以免它混淆命名空间.当然,我想过使用lambda,它是一个匿名函数:

static const QStringList AllSupportedExtensions = []() -> QStringList {
    QStringList list = QStringList() << JpegFileExtensions << TiffFileExtensions << RawFileExtensions << PngFileExtensions;
    for (QString& item: list)
        item.remove("*.");

    return list;
} ();

请注意空捕获列表和空参数列表.它在Windows(msvc-2013)和OS X(clang-700.1.81)上编译和工作.怎么会这样?它是否符合标准,是否应该使用空捕获列表进行编译?



1> NathanOliver..:

lambda没有抓到任何东西.您正在函数中使用全局变量.lambda的函数体是放在operator()代表lambda的未命名类中的内容.您可以使用任何功能执行此操作.

你可以看到这个使用这个简单的例子

int i = 10;

class Foo
{
public:
    void operator()() { i = 20; }
};

int main(){

    Foo f;
    f();
    std::cout << i;
}

Live Example

推荐阅读
雯颜哥_135
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有