У меня есть лямбда внутри функции, которая захватывается [&]
, а затем использует локальную статическую переменную внутри лямбда. Я не уверен, если это действует, чтобы начать с, но это компилируется и штраф:Неопределенная ссылка, фиксирующая статическую переменную в 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
Итак, у меня есть два вопроса:
- Использует
i
в первом примере даже допустимый C++? - Если # 1, то что не так со вторым примером? Или это ошибка gcc?
Технически, только «переменные» с автоматическим временем хранения «захватываются». В обоих примерах ссылка на 'i' является просто обычным действительным значением lvalue. – aschepler