Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/157.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_Language Lawyer - Fatal编程技术网

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中也是如此