Test
является объявленным до лямбды, но оно не определено . Определение класса заканчивается только в конце самого класса, когда вы делаете };
. До этого это неполный тип.
И вы не можете получить доступ к членам неполного типа. Или, по крайней мере, не через экземпляр объекта, как вы делаете в своей лямбде (вы можете говорить о Test::n
в этот момент, но вы не можете взять Test*
и сделать ->n
на нем).
Теперь вы можете сказать, что если вы сделаете f
нормальным статическим членом, вы можете легко поместить определение класса туда, и оно будет работать. Это связано с тем, что в C ++ есть специальное правило для определения функций-членов класса. А именно, тела этих функций считаются определенными, как если бы они были размещены сразу после определения класса. Таким образом, они могут внутренне использовать класс, как если бы он был полным типом, поскольку тела этих функций будут определены в месте, где они являются законченным типом.
Ваша лямбда не является функцией-членом;это лямбда-функция, назначаемая статической переменной класса. Инициализаторы статических переменных не получают такой специальной обработки, поэтому Test
считается неполным внутри тела лямбда-функции.