具有空捕获列表的Lambda仍然能够从全局范围捕获对象
Lambda with empty capture list still able to capture objects from global scope?
我有几个全局静态对象。别介意这些是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-7001.81)上编译和工作?它是否符合标准,是否应该使用空的捕获列表进行编译?
lambda没有捕获任何内容。您在函数中使用全局变量。lambda的函数体是放在表示lambda的未命名类的operator()
中的内容。您可以使用任何函数来执行此操作。
你可以在这个简单的例子中看到这一点
int i = 10;
class Foo
{
public:
void operator()() { i = 20; }
};
int main(){
Foo f;
f();
std::cout << i;
}
实时示例
相关文章:
- 为什么在全局范围内使用"extern int a"似乎不行?
- 在全局变量中保存类的实例以重新创建类(创建"backup")
- 当vector是tje全局变量时,c++中vector的内存管理
- std::threads可以从Windows DLL中的全局变量创建/销毁吗?
- 如何创建一个空的全局类并在启动时实例化它
- 内联函数中具有内部链接的全局变量
- 为什么虚函数不能是静态的和全局的?
- 如何在信号处理程序和普通函数中对全局变量进行互斥读写操作
- 向量范数的c++中的||运算符
- 全局作用域中函数指针的赋值
- g++用户定义的动态链接库上的全局new和delete运算符
- 在命名空间中使用全局命名空间中的函数
- 全局变量 多读取器 一个写入器多线程安全?
- 类的全局对象和静态成员
- 如何声明一个可以在整个程序中使用的全局 2d 3d 4d .. 数组(堆版本)变量?
- 如果全局变量默认是外部变量,为什么要添加"extern"关键字?
- 不同作用域中的静态变量和全局变量
- 如何使用 llvm-10 库在C++定义 LLVM 全局值变量?
- 使用全局声明的向量时,C++双重释放错误/损坏
- 将线程中的数据存储到全局容器的最佳方法?