我正在尝试编写一个用超现代的奥术编码技术编写的程序.这些技术是如此先进,GCC和Clang工作,但Visual Studio 2017引发了错误.现在我想知道Visual Studio是否正确.
考虑以下程序:
#include <functional>
#include <iostream>
class A
{
public:
A(int i) : foo(i) { }
private:
int foo;
friend class B;
};
class B
{
public:
void printFooFromA(const A& a, std::function<void (const A&)> printer = [](const A& a) {
std::cout << "a.foo is " << a.foo << std::endl;
}) {
printer(a);
}
};
int main()
{
A a(123);
B b;
b.printFooFromA(a);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
Visual Studio抛出错误C2248:'A :: foo':无法访问在类'A'中声明的私有成员.
错误的根源在printFooFromA的声明中:"printer"参数以lambda的形式给出一个默认值.在lambda中,它访问A :: foo.由于foo是私有的,因此只能在A或A的朋友中访问.
这是否是一个错误取决于lambda是否应该被视为A的朋友.Visual Studio说不,而GCC说是.C++标准是否指定了这个?
编辑添加:StackOverflow上存在关于lambda是否被视为类的朋友的问题,但这些问题都没有解决lambda处于默认参数位置以及这是否符合标准C++的情况.