Visual Studio 2010 中的友元模板类和 Lambda 函数
Friend Template Classes and Lambda Functions in Visual Studio 2010
我在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 还有其他错误,所以它无法编译这种情况并不让我感到惊讶。
相关文章:
- C++Boost Asio Pool线程,带有lambda函数和传递引用变量
- 如何建立使用模板函数的lambda函数的尾部返回类型
- 我可以将调用类的"this"传递给 lambda 函数吗?
- 两组使用lambda函数的大括号
- 尝试将lambda函数放在队列中时出现一般分配器错误(可能是与unique_ptr有关的错误)
- 我可以在这里替换什么,因为我不能在 C# 中使用隐式变量的 lambda 函数?
- 为什么我不能在 constexpr lambda 函数中使用 std::tuple
- C++:Lambda 函数指针转换的用例是什么?
- 将 lambda 函数作为参数传递C++
- 如何将 lambda 函数作为参数发送到另一个函数
- 传递 lambda 函数的权衡是什么?
- 如何使用类模拟 C++11 中的 lambda 函数和闭包?
- 不是 lambda 函数中的常量表达式
- 如何使用可变参数数重载 lambda 函数?
- 如何通过指针传递lambda函数?
- 使用带有 lambda 函数指针的模板
- openmp c++ 中并行块内 lambda 函数的奇怪行为
- C++ 中 Lambda 函数中的溢出
- 将数组传递到 lambda 函数中
- lambda 函数未显示正确的结果