Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/162.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 从类外部调用lambda中的私有函数_C++_C++11_Lambda_This - Fatal编程技术网

C++ 从类外部调用lambda中的私有函数

C++ 从类外部调用lambda中的私有函数,c++,c++11,lambda,this,C++,C++11,Lambda,This,在我当前的项目中,我试图将一个私有成员函数作为参数传递给另一个函数。在我的代码中,另一个函数是另一个类的成员函数,但为了保持简单,这里它是一个自由函数 void outside_function(std::function<void(int)> func) { // do something with func } class MyClass { public: void run(); private: bool my_func(double); // define

在我当前的项目中,我试图将一个私有成员函数作为参数传递给另一个函数。在我的代码中,另一个函数是另一个类的成员函数,但为了保持简单,这里它是一个自由函数

void outside_function(std::function<void(int)> func) {
  // do something with func
}


class MyClass {
public:
  void run();

private:
  bool my_func(double); // defined in source file
};
为什么这样做有效?就我的理解而言,
outside\u function
无权访问
my\u func
。为什么我不先公开我的功能?是编译器做的事情还是C++规则我不知道?
此外,这种方法是否有可能破坏我的代码?

private
访问说明符仅限制对象名称在类外可见(无法查找)。对象本身与任何其他成员一样

类的成员可以是

(1.1)私人;也就是说,它的名称只能由声明它的类的成员和朋友使用

(1.2)受保护;也就是说,它的名称只能由声明它的类的成员和朋友、从该类派生的类及其朋友使用(请参见[class.protected])

(1.3)公众;也就是说,它的名称可以在任何地方使用,而不受访问限制


outside_函数
从不访问成员(它只知道
func
参数的类型,不可能关心它是如何定义的)——只有lambda函数可以访问

由于在
MyClass
中定义lambda函数,因此可以访问其中的所有私有名称


outside\u function
调用提供的函数,但如果不允许调用使用任何私有成员的函数,则无法执行太多操作。

好的,我明白了。我的误解可能是认为lambda是
MyClass
之外的东西。谢谢@KorbenDose lambda表达式返回在当前作用域中定义的函数对象(由捕获列表管理)。因此,它可以访问该范围内可访问的任何内容。这相当于声明和创建一个类实例,该类将使用该范围中的值或\和引用进行初始化,并定义了
operator()
void MyClass::run() {
  outside_function([this](int a) -> void {
    double d = static_cast<double>(a);
    this->my_func(d);
  });
}