Учитывая следующий пример кода:
int main()
{
int i;
auto f = [=]()mutable->int*
{
return &i;
};
return 0;
}
- g++ v.4.8.1 предупреждает, что "адрес локальной переменной" я вернулся ".
- Clang v.3.2 (MacOS Clang) предупреждает, что "адрес памяти стека связанные с локальной переменной "i".
- Ни VS2012, ни VS2013 RC не предупреждают о чем-либо.
Мое понимание lambdas заключается в том, что компилятор будет генерировать класс функтора. Этот класс функторов будет содержать члены для всех скопированных переменных (i
в примере). Я считаю, что в контексте моего кода, пока существует f
, можно вернуть адрес одного из его членов. Мне кажется, что все компиляторы ошибались. Я думаю, что предупреждение об использовании адреса f
member i
после f
выходит за рамки допустимо, но предупреждения о "локальной переменной i" неверны/вводятся в заблуждение. Я прав?