2015-12-21 21 views
0

我有幾個全局靜態對象。不要介意這些是Qt類,這與這個問題無關。現在具有空捕獲列表的Lambda仍能夠從全局範圍捕獲對象?

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

,你可以做一個[MCVE],刪除了Qt的依賴,並提供一個'主()'? – YSC

+0

@YSC:好的。等一下。 –

+0

郝,沒關係,看看NathanOliver的回答。就這麼簡單。 – YSC

回答

6

該lambda沒有捕獲任何東西。你在一個函數中使用全局變量。 lambda的函數體是放在代表lambda的未命名類的operator()內部的東西。你可以用任何函數來做到這一點。

你可以看到這方面的工作與這個簡單的例子

int i = 10; 

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

int main(){ 

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

Live Example

+0

我明白了,謝謝。很明顯,它會與一個普通的課程,我只是不確定lambda。 –

+0

@VioletGiraffe lambda是一個類。來自[expr.prim.lambda]:* lambda表達式(也是閉包對象的類型)的類型是唯一的,未命名的非聯合類型 類類型* – NathanOliver