小编N.E*_*.C.的帖子

默认参数位置的Lambda无法访问好友成员.这是编译器错误吗?

我正在尝试编写一个用超现代的奥术编码技术编写的程序.这些技术是如此先进,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++的情况.

c++ lambda visual-c++ c++11 visual-studio-2017

6
推荐指数
1
解决办法
150
查看次数

标签 统计

c++ ×1

c++11 ×1

lambda ×1

visual-c++ ×1

visual-studio-2017 ×1