我在一个函数内部有一个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:错误:ld返回1退出状态
所以,我有两个问题:
i
甚至是有效的c ++?答案 0 :(得分:4)
1)是的,您甚至可以从定义中删除&
,因为static
始终可以在lambda函数中访问。
2)这是错误:http://gcc.gnu.org/bugzilla/show_bug.cgi?id=54276
答案 1 :(得分:-2)
1)是的,假设您打算在通话之间保持'i'的价值。
2)这不是编译器中的错误。静态实例变量也需要通过模板定义。请参阅this post。