我在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是模板类时才会发生这种情况 .
1 回答
这个编译精度为4.6和4.7 . 我认为这也是合法的 - lambda应该具有与其定义的函数一样多的访问权限 .
C 11标准,5.1.2p7说(重点补充):
我读到这意味着封闭块内的任何有效内容在lambda体中都是有效的 .
MSVC2010还有其他带有lambdas的bug,所以我不会惊讶于它无法编译这种情况 .