首页 文章

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

提问于
浏览
2

我在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 回答

  • 2

    这个编译精度为4.6和4.7 . 我认为这也是合法的 - lambda应该具有与其定义的函数一样多的访问权限 .

    C 11标准,5.1.2p7说(重点补充):

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

    我读到这意味着封闭块内的任何有效内容在lambda体中都是有效的 .

    MSVC2010还有其他带有lambdas的bug,所以我不会惊讶于它无法编译这种情况 .

相关问题