2

我在VS2010中遇到了编译错误,不知道是不是编译器的bug:

我尽可能地简化了场景:一个模板类被声明为某个类的友元,并尝试在 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 是模板类时才会发生这种情况。

4

1 回答 1

2

这在 g++ 4.6 和 4.7 中编译得很好。我认为这也是合法的 --- lambda 应该具有与其定义的函数一样多的访问权限。

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

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

我认为这意味着封闭块中的任何有效内容在 lambda 主体中都是有效的。

MSVC2010 有其他的 lambda 错误,所以它无法编译这个案例并不让我感到惊讶。

于 2012-04-15T08:32:41.883 回答