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

Friend Template Classes and Lambda Functions in Visual Studio 2010

本文关键字:Lambda 函数 友元 Studio 2010 Visual      更新时间:2023-10-16

我在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 是模板类时,才会发生这种情况。

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

C++11标准,5.1.2p7说(着重号是加的):

lambda 表达式的复合语句

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

我将其理解为意味着封闭块中任何有效的内容在 lambda 正文中都是有效的。

MSVC2010 lambda 还有其他错误,所以它无法编译这种情况并不让我感到惊讶。