C ++ 11 sagt (5.1.2, p3), dass der Typ eines Lambda " in the smallest block scope, class scope, or namespace scope that contains the corresponding lambda-expression.
" deklariert wird. In diesem Fall wird der Typ in f
deklariert. Die CD von C ++ 14 hat dieselbe Sprache.
Also ist die Frage wirklich, was der Namespace für eine lokale Klasse ist. Ich glaube nicht, dass es einen hat.
C ++ 11, Abschnitt 9.8, p1, gibt an: The name of a local class is local to its enclosing scope.
Als solches glaube ich nicht, dass es irgendwelche zugeordneten Namespaces (gemäß 3.4.2, p2) hat und daher nicht ADL unterliegt.
§3.4.2 / 2 sagt
Wenn T ein Klassentyp ist (einschließlich Vereinigungen), sind die ihm zugeordneten Klassen: die Klasse selbst; die Klasse, der es angehört, falls vorhanden; und seine direkten und indirekten Basisklassen. Die zugehörigen Namespaces sind die Namespaces, deren zugehörige Klassen Mitglieder sind.
Die Namespace-Assoziation durchdringt nur eine Ebene der Klassenverschachtelung und nicht über Funktionsbereiche, wenn dies wörtlich genommen wird. Aber sowohl Clang als auch GCC erlauben mehrere Ebenen der Klassenverschachtelung, und GCC macht auch Funktionsbereiche transparent.
Es sieht so aus, als wären mehrere Ebenen der Klassenverschachtelung ein Fehler, und lokale Klassen sind ein Versehen in C ++ 11, da es vor C ++ 11 keine Möglichkeit gab, eine lokale Klasse aus ihrem Namensraum herauszunehmen - sie waren nicht als Vorlage Argumente erlaubt.