【问题标题】:undefined reference capturing static variable in lambda未定义的引用捕获 lambda 中的静态变量
【发布时间】: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 个退出状态

所以,我有两个问题:

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

【问题讨论】:

  • 从技术上讲,只有具有自动存储持续时间的变量才会被“捕获”。在这两个示例中,对 i 的引用只是普通的有效左值使用。

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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 那篇文章是关于静态类成员的,而不是函数的局部静态。我如何明确提及这些?
    • 我认为您最终遇到了问题。主要是 b/c 每个模板特化在您使用它时都会被实例化(因此您会获得静态变量的多个实例)。
    猜你喜欢
    • 2023-03-03
    • 2016-08-04
    • 1970-01-01
    • 1970-01-01
    • 2020-08-04
    • 1970-01-01
    相关资源
    最近更新 更多