Visual Studio 2010中的朋友模板类和Lambda函数

时间:2012-04-15 08:10:29

标签: c++ visual-studio-2010 lambda c++11 friend

我在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 个答案:

答案 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的错误,因此我无法编译这个案例。