2

我在函数内部有一个 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 退出状态

所以,我有两个问题:

  1. i在第一个示例中使用甚至是有效的 c++ 吗?
  2. 如果#1,那么第二个例子有什么问题?或者这是一个 gcc 错误?
4

2 回答 2

4

1)是的,您甚至可以&从定义中删除,因为static在 lambda 函数中始终可以访问。2)这是错误:http ://gcc.gnu.org/bugzilla/show_bug.cgi?id=54276

于 2013-03-01T18:16:27.550 回答
-2

1)是的,假设您打算在通话之间保持“i”的值。

2)这不是编译器中的错误。静态实例变量也需要通过模板定义。请参考这篇文章

于 2013-03-01T18:18:01.983 回答