C++ 在C+中有闭包吗+;?

C++ 在C+中有闭包吗+;?,c++,closures,lexical-closures,C++,Closures,Lexical Closures,我在网上读到关于闭包的文章。我想知道C++是否有一个内置的闭包设施,或者如果有任何方法可以在C++中实现闭包? 最新的C++标准,有闭包。p> 是的,C++11具有名为的闭包 在C++03中,没有对lambdas的内置支持,但有实现。我怀疑这取决于闭包的含义。我的意思是 “总是使用”意味着某种类型的垃圾收集(尽管我认为 可以使用引用计数实现);与其他方面的lambdas不同 捕获引用并保留引用对象的语言 活着,C++ lambdas要么捕获一个值,要么引用对象 未保持活动状态(引用可能很容易挂

我在网上读到关于闭包的文章。我想知道C++是否有一个内置的闭包设施,或者如果有任何方法可以在C++中实现闭包?

最新的C++标准,有闭包。p>


是的,C++11具有名为的闭包


在C++03中,没有对lambdas的内置支持,但有实现。

我怀疑这取决于闭包的含义。我的意思是 “总是使用”意味着某种类型的垃圾收集(尽管我认为 可以使用引用计数实现);与其他方面的lambdas不同 捕获引用并保留引用对象的语言 活着,C++ lambdas要么捕获一个值,要么引用对象
未保持活动状态(引用可能很容易挂起)。

如果您将闭包理解为对具有嵌入、持久、隐藏和不可拆分上下文(内存、状态)的函数的引用,则是:

class add_offset {
private:
    int offset;
public:
    add_offset(int _offset) : offset(_offset) {}
    int operator () (int x) { return x + offset; }
}

// make a closure
add_offset my_add_3_closure(3);

// use closure
int x = 4;
int y = my_add_3_closure(x);
std::cout << y << std::endl;
类添加偏移量{ 私人: 整数偏移量; 公众: add_offset(int_offset):offset(_offset){ int运算符()(int x){return x+offset;} } //了结 添加\u偏移我的\u添加\u 3\u闭包(3); //使用闭包 int x=4; int y=我的加3闭包(x);
std::cout是的,这显示了如何在不使用函子的情况下使用状态实现函数

#include <iostream>
#include <functional>


std::function<int()> make_my_closure(int x){
    return [x]() mutable {   
        ++x;
        return x;   
    };
}

int main()
{
    auto my_f = make_my_closure(10);

    std::cout << my_f() << std::endl; // 11
    std::cout << my_f() << std::endl; // 12
    std::cout << my_f() << std::endl; // 13

     auto my_f1 = make_my_closure(1);

    std::cout << my_f1() << std::endl; // 2
    std::cout << my_f1() << std::endl; // 3
    std::cout << my_f1() << std::endl; // 4

    std::cout << my_f() << std::endl; // 14
}
#包括
#包括
std::函数make_my_闭包(intx){
返回[x]()可变{
++x;
返回x;
};
}
int main()
{
auto my_f=make_my_闭包(10);

严格来说,“Closure”仅为LISP。使用Let返回lambda作为最后的命令。“Let Over lambda”。这仅适用于LISP,因为具有词汇作用域的无限范围。在知道之前,我不知道任何其他语言本机支持这一点

(defun my-closure ()
   (let ((cnt 0))
      (lambda () 
         (format t "called : ~A times" (incf cnt)))))

除了下面的答案,还要查看更多的参考页。显然,很多人仍然将匿名函数与闭包混合在一起。我仍然不清楚C++11是否真的支持闭包,或者仅仅支持匿名函数(“lambdas”)我不希望C++支持与JavaScript、Python、斯卡拉和其他人一样的实际闭包,这会让人感到非常惊讶。证明我自己错了,是的,它在上下文中复制变量,甚至通过引用引用,唯一的怪癖是没有垃圾收集……还是想更好地理解THE。实际上,行为类似于闭包,但我不会说它是闭包。@Stepenre有什么区别?这看起来不像闭包,这里的对象持有一个方法修改的状态,加上一些语法糖,因为它是“operator()”而不是任何其他方法。让它返回一个取决于状态或方法参数的lambda,然后我们开始讨论。@dividebyzero一件事是闭包的抽象概念,另一件事是如何在编程语言中使用该概念。在上面的示例中,“my_add_3_闭包”和“adder”这里的对象实际上是对函数的引用……我想强调的是闭包的思想在C++编程之前使用了很久以前的C++ 11,新的lambda构造只是使它更容易。“AnthonyMonterrosa,你在你的论点中犯了错误。<代码>私有:int和<代码>该成员只能由成员函数访问,但它仍然属于实例,而不属于类。
static int sum
将属于该类。可以确定的是,如果在
my\u f1()之后再次运行
my\u f()
,将会发生什么,因为它可能仍然是与刚才调用C++代码> MaxyMyOxOuts直接分配的变量。<代码> x>代码>是 MaxyMyOxLoopy中的临时值。所以IMO没有意义。我添加了您所询问的情况。传递的隐藏类。由于类被传递,函数singnatures是不兼容的。是的,我们有一些闭包,但它们不是实际的闭包,它们不是一个可以访问其他函数变量的函数,它被分配,它的地址可以传递。既不使用bind,也不使用lambda表达式。Visual Studio/VisualCPP不支持alloc_回调,而alloc_回调在C中用于此操作。并且不能将成员函数传递给需要静态函数的函数。
(defun my-closure ()
   (let ((cnt 0))
      (lambda () 
         (format t "called : ~A times" (incf cnt)))))