【发布时间】:2013-03-01 18:12:28
【问题描述】:
我在函数内部有一个 lambda,它使用 [&] 捕获,然后在 lambda 内部使用局部静态变量。我不确定这是否有效,但这可以正常编译和链接:
void Foo()
{
static int i = 5;
auto bar = [&]()
{
i++;
};
bar();
}
int main()
{
Foo();
}
但是通过将Foo 设为模板函数:
template <typename T>
void Foo()
{
static int i = 5;
auto bar = [&]()
{
i++;
};
bar();
}
int main()
{
Foo<int>();
}
我收到以下错误:
g++-4.7 -std=c++11 main.cpp
/tmp/cctjnzIT.o:在函数'void Foo()::{lambda()#1}::operator()() const'中:
main.cpp:(.text+0x1a): 未定义对“i”的引用
main.cpp:(.text+0x23): 未定义对“i”的引用
collect2: error: ld 返回 1 个退出状态
所以,我有两个问题:
- 在第一个示例中使用
i甚至是有效的 c++ 吗? - 如果 #1,那么第二个示例有什么问题?或者这是一个 gcc 错误?
【问题讨论】:
-
从技术上讲,只有具有自动存储持续时间的变量才会被“捕获”。在这两个示例中,对
i的引用只是普通的有效左值使用。