【问题标题】:Friend Template Classes and Lambda Functions in Visual Studio 2010Visual Studio 2010 中的 Friend 模板类和 Lambda 函数
【发布时间】:2012-04-26 23:28:22
【问题描述】:

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

【问题讨论】:

  • 有人可以在其他编译器上测试它吗?

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


【解决方案1】:

这在 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 表达式的上下文中考虑

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

MSVC2010 在 lambda 方面存在其他错误,因此它无法编译此案例并不令我感到惊讶。

【讨论】:

  • 谢谢。我会将其转发给 Microsoft。
  • 更新:该错误已被微软修复,该修复将在下一个版本中推出(未给出适当数据)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多