C++ 为什么要在声明范围之外使用lambda或从声明范围调用的函数?
有几种方法可以将可调用对象作为参数传递或存储以备将来使用。您可以使用C++ 为什么要在声明范围之外使用lambda或从声明范围调用的函数?,c++,c++11,lambda,language-lawyer,C++,C++11,Lambda,Language Lawyer,有几种方法可以将可调用对象作为参数传递或存储以备将来使用。您可以使用operator()创建一个类,您可以定义一个函数并传递指向它的指针,而且,由于C++11,您可以通过[](){}语法定义lambda 我很欣赏lambda语法作为表达式中的快捷方式,比如find_if,它常常要求一个紧凑的可调用表达式。关于lambda,我不理解的是希望在声明之外使用它们,并冒着引入悬空引用之类的风险。C++已经有了一个强大的方法来传递可调用对象,而在那些情况下,它比LAMBDA更安全,在这种情况下,lambd
operator()
创建一个类,您可以定义一个函数并传递指向它的指针,而且,由于C++11,您可以通过[](){}
语法定义lambda
我很欣赏lambda语法作为表达式中的快捷方式,比如find_if
,它常常要求一个紧凑的可调用表达式。关于lambda,我不理解的是希望在声明之外使用它们,并冒着引入悬空引用之类的风险。C++已经有了一个强大的方法来传递可调用对象,而在那些情况下,它比LAMBDA更安全,在这种情况下,lambda的紧凑表达式没有任何好处。
因此,问题是:为什么C++11允许在声明is的函数或从中调用的函数之外使用lambda(因此引入了挂起引用等风险)?您能举一个例子,让lambda活动在声明函数之外是可取的吗 考虑一个注册为在未来事件发生时调用的函数。将其定义为lambda会很方便,但它必须超出定义它的范围: 比如说
m_button->setOnClick(YOUR LAMBDA GOES HERE);
考虑一个注册为在未来事件发生时调用的函数。将其定义为lambda会很方便,但它必须超出定义它的范围: 比如说
m_button->setOnClick(YOUR LAMBDA GOES HERE);
关于lambda,我不理解的是希望在声明之外使用它们,并冒着引入悬空引用之类的风险。C++已经有了一个强大的方法来传递可调用对象,而在那些情况下,它比LAMBDA更安全,在这种情况下,lambda的紧凑表达式没有任何好处。
(1) Lambda并不比任何其他定义函数对象的方法安全。传递lambda的方式与传递命名函子的实例完全相同
可以在命名函子中存储引用,也可以在lambda中捕获引用。如果函数对象超出了这些引用绑定的范围,则在这两种情况下存储对本地对象的引用都是一个严重的错误
lambda的语法是否有用,取决于您的偏好。我想,有人可能会说,因为lambdas使函子的定义更简单,它也使破碎函子的定义更简单
为什么C++11允许在声明is的函数或从中调用的函数之外使用lambda(因此引入了挂起引用等风险)
首先,我认为这样的语义限制很难实现。你不能让它们不可复制,因为这会使它们在标准算法中毫无用处
其次,因为存储函数对象以供以后使用很有用,请参见(2),使用lambdas并不比使用命名函子的实例更危险,请参见(1)
您能举一个例子,让lambda活动在声明函数之外是可取的吗
(2) 几乎所有异步回调情况<代码>标准::异步,标准::线程
,GUI和其他事件系统。可调用函数对象将被存储以供以后在这些情况下使用,并且通常这些对象在创建它们的范围之外
一般来说,也是在本例中,lambdas比命名函子类型的优势在于,您可以将函数定义放在使用它的地方。当然,在异步回调的一般情况下,您永远无法得到它实际使用的定义,但是注册回调的意义是尽可能接近的
lambdas的缺点是人们很难解析不同括号、大括号和括号的语法。同样,这是偏好的问题
关于lambda,我不理解的是希望在声明之外使用它们,并冒着引入悬空引用之类的风险。C++已经有了一个强大的方法来传递可调用对象,而在那些情况下,它比LAMBDA更安全,在这种情况下,lambda的紧凑表达式没有任何好处。
(1) Lambda并不比任何其他定义函数对象的方法安全。传递lambda的方式与传递命名函子的实例完全相同
可以在命名函子中存储引用,也可以在lambda中捕获引用。如果函数对象超出了这些引用绑定的范围,则在这两种情况下存储对本地对象的引用都是一个严重的错误
lambda的语法是否有用,取决于您的偏好。我想,有人可能会说,因为lambdas使函子的定义更简单,它也使破碎函子的定义更简单
为什么C++11允许在声明is的函数或从中调用的函数之外使用lambda(因此引入了挂起引用等风险)
首先,我认为这样的语义限制很难实现。你不能让它们不可复制,因为这会使它们在标准算法中毫无用处
其次,因为存储函数对象以供以后使用很有用,请参见(2),使用lambdas并不比使用命名函子的实例更危险,请参见(1)
您能举一个例子,让lambda活动在声明函数之外是可取的吗
(2) 几乎所有异步回调情况<代码>标准::异步,标准::线程
,GUI和其他事件系统。可调用函数对象将被存储以供以后在这些情况下使用,并且通常这些对象在创建它们的范围之外
总的来说,在本cas中也是如此