2013-03-01 3 views
1

У меня есть лямбда внутри функции, которая захватывается [&], а затем использует локальную статическую переменную внутри лямбда. Я не уверен, если это действует, чтобы начать с, но это компилируется и штраф:Неопределенная ссылка, фиксирующая статическую переменную в 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: In function 'void Foo()::{lambda()#1}::operator()() const':
main.cpp:(.text+0x1a): undefined reference to 'i'
main.cpp:(.text+0x23): undefined reference to 'i'
collect2: error: ld returned 1 exit status

Итак, у меня есть два вопроса:

  1. Использует i в первом примере даже допустимый C++?
  2. Если # 1, то что не так со вторым примером? Или это ошибка gcc?
+0

Технически, только «переменные» с автоматическим временем хранения «захватываются». В обоих примерах ссылка на 'i' является просто обычным действительным значением lvalue. – aschepler

ответ

-2

1) Да, предполагая, что вы намерены поддерживать ценность «i» между вызовами.

2) Это не ошибка в компиляторе. Статическая переменная экземпляра также должна быть определена с помощью шаблона. Пожалуйста, обратитесь к this post.

+0

Это сообщение о статических членах класса, а не о статистике, локальном для функций. Как я могу прямо ссылаться на них? – JaredC

+0

Я думаю, что у вас проблема. В основном b/c каждая специализированная специализация создается при ее использовании (и, следовательно, вы получаете несколько экземпляров вашей статической переменной). –

Смежные вопросы