我有几个全局静态对象。不要紧,这些是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)上编译和工作。怎么会这样?它是否符合标准,是否应该使用空捕获列表进行编译?
答案 0 :(得分:6)
lambda没有抓到任何东西。您正在函数中使用全局变量。 lambda的函数体是放在代表lambda的未命名类的operator()
内。您可以使用任何功能执行此操作。
你可以看到这个使用这个简单的例子
int i = 10;
class Foo
{
public:
void operator()() { i = 20; }
};
int main(){
Foo f;
f();
std::cout << i;
}