未定义的引用捕获lambda中的静态变量

时间:2013-03-01 18:12:29

标签: c++ gcc c++11 lambda

我在一个函数内部有一个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 bug?

2 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:-2)

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

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