Was sagt der Standard über den Namensraum von Lambdatypen?

8

Nehmen wir an, ich habe ein Setup wie folgt:

%Vor%

Die Frage ist, ob ADL für den Lambda-Typ den überladenen Operator in diesem Namensraum durch Standard findet.

    
Puppy 25.05.2013, 18:03
quelle

2 Antworten

10

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.

    
Nicol Bolas 25.05.2013, 18:20
quelle
0

§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.

    
Potatoswatter 27.05.2013 13:00
quelle

Tags und Links