2012-04-15 71 views
2

我在VS2010中遇到编译错误,我不知道它是否应该被视为一个编译器错误或不:朋友模板类和lambda函数在Visual Studio 2010

我简化了场景尽可能:模板类被声明为某个类的朋友,并尝试访问lambda函数内的朋友的私有成员。代码如下:

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 2012-04-15 08:19:05

回答

2

这在g ++ 4.6和4.7中编译得很好。我认为这是法律太---拉姆达应该有尽可能多的访问,因为它是在定义函数

C++的11个标准,5.1.2p7说,(强调):

的lambda表达式的复合语句产生函数调用操作符的函数体(8.4),但为了名称查找(3.4),确定这个(9.3.2)的类型和值以及将非表达式转换为非使用(* this)(9.3.1),将静态类成员转换为类成员访问表达式复合语句将在lambda表达式的上下文中考虑。

我读到的意思是说,封闭块内有效的任何东西在拉姆达体内都是有效的。

MSVC2010有lambda的其他错误,所以它不会让我感到惊讶,它不能编译这种情况。

+0

谢谢。我会将此转发给Microsoft。 – killogre 2012-04-15 08:42:03

+0

更新:该错误已由Microsoft修复,该修补程序将在下一个版本中推出(未提供任何适当的数据) – killogre 2012-04-18 06:15:57