2012-04-15 2 views
2

Я обнаружили ошибку компиляции в VS2010, и я не знаю, если это должно рассматриваться как ошибка компилятора или нет:Friend шаблон Классы и Lambda функция в Visual Studio 2010

Я упростил сценарий, насколько это возможно : класс шаблона объявляется другом некоторого класса и пытается получить доступ к закрытым членам друга внутри лямбда-функции. Вот код:

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(); 
} 

Обратите внимание, что это происходит, только если Bar является классом шаблона.

+0

может кто-нибудь проверить его на других компиляторах, пожалуйста? – killogre

ответ

2

Это компилируется в g ++ 4.6 и 4.7. Я думаю, что это законно слишком --- лямбда должен иметь такой же доступ, как функции она определена в

стандарт C++ 11, 5.1.2p7 говорит (курсив наш):.

Составной оператор lambda-expression возвращает тело функции (8.4) оператора вызова функции, но для целей поиска по имени (3.4), определяя тип и значение этого (9.3.2) и преобразуя выражения id, -статические члены класса в выражения доступа к членам класса, используя (* this) (9.3.1), составной оператор рассматривается в контексте лямбда-выражения.

Я читал это как означающее, что в корпусе лямбда действует что-либо действующее в закрывающем блоке.

MSVC2010 имеет другие ошибки с lambdas, поэтому меня не удивляет, что он не может скомпилировать этот случай.

+0

Спасибо. Я отправлю это Microsoft. – killogre

+0

Обновление: ошибка была исправлена ​​Microsoft, и исправление будет развернуто в следующей версии (без данных) – killogre

Смежные вопросы