我在VS2010中遇到编译错误,我不知道是否应将其视为编译器错误:
我尽可能地简化了场景:模板类被声明为某个类的朋友,并尝试访问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 :(得分:2)
这在g ++ 4.6和4.7中编译得很好。我认为这也是合法的 - lambda应该具有与其定义的函数一样多的访问权限。
C ++ 11标准,5.1.2p7说(重点补充):
lambda-expression的复合语句产生函数调用操作符的函数体(8.4),但是为了查找名称(3.4),确定它的类型和值(9.3.2)并转换id-使用(* this)(9.3.1)将非静态类成员引用到类成员访问表达式中的表达式,在lambda表达式的上下文中考虑复合语句。
我读到这意味着封闭块内的任何有效内容在lambda体中都有效。
MSVC2010还有其他一些lambdas的错误,因此我无法编译这个案例。