2012-04-15 6 views
2

Ich trafen einen Übersetzungsfehler in VS2010, und ich weiß nicht, ob es einen Compiler Fehler oder nicht in Betracht gezogen werden sollte:Freund Template-Klassen und Lambda-Funktionen in Visual Studio 2010

ich das Szenario so weit wie möglich vereinfachte : Eine Vorlagenklasse wird als Freund einer Klasse deklariert und versucht, auf die privaten Mitglieder des Freundes innerhalb einer Lambda-Funktion zuzugreifen. Hier ist der Code:

class Foo { 
    template<typename T> friend class Bar; 
    int priv; 
}; 

template<typename T> 
class Bar { 
public: 

    void func() { 
     Foo foo; 
     foo.priv = 17; // compiles 
     auto lambda_func = [](Foo& _foo) { _foo.priv = 17; }; // doesn't compile 
    } 
}; 

void test() { 
    Bar<int> bar; 
    bar.func(); 
} 

Beachten Sie, dass dies nur passiert, wenn Bar eine Vorlagenklasse ist.

+0

kann jemand es bitte auf andere Compiler testen? – killogre

Antwort

2

Dies kompiliert in g ++ 4.6 und 4.7. Ich denke, es ist zu Rechts --- die Lambda sollte so viel Zugang wie die Funktion haben es in definiert ist

Die C++ 11-Standard, 5.1.2p7 sagt (Hervorhebung hinzugefügt).

Die Die zusammengesetzte Anweisung von lambda-expression liefert den Funktionskörper (8.4) des Funktionsaufrufoperators, aber zum Zweck der Namenssuche (3.4), Bestimmen des Typs und des Wertes davon (9.3.2) und Transformieren von ID-Ausdrücken, die sich auf nicht beziehen -static-Klassenmitglieder in Klassenmitglieds-Zugriffsausdrücke unter Verwendung von (* this) (9.3.1), wird die zusammengesetzte Anweisung im Zusammenhang mit dem Lambda-Ausdruck betrachtet.

Ich habe gelesen, dass alles, was innerhalb des umschließenden Blocks gültig ist, im Lambda-Körper gültig ist.

MSVC2010 hat andere Bugs mit Lambdas, so überrascht es mich nicht, dass es diesen Fall nicht kompiliert.

+0

Danke. Ich werde dies an Microsoft weiterleiten. – killogre

+0

Update: Der Fehler wurde von Microsoft behoben und der Fix wird in der nächsten Version eingeführt (keine Fälligkeitsdaten angegeben) – killogre