C ++ 11 lambda如何表示和传递?

问题描述 投票:31回答:3

在C ++ 11中传递lambda非常容易:

func( []( int arg ) {
  // code
} ) ;

但是我想知道,成本是什么将lambda传递给这样的函数?如果func将lambda传递给其他函数怎么办?

void func( function< void (int arg) > f ) {
  doSomethingElse( f ) ;
}

lambda的传递是否昂贵?由于function对象can被分配为0,因此>

function< void (int arg) > f = 0 ; // 0 means "not init" 

这使我认为函数对象有点像指针。但是,如果不使用new,则意味着它们可能类似于值类型的struct或类,它们默认为堆栈分配和成员级复制。

当您通过“按值”传递函数对象时,如何传递C ++ 11的“代码体”和捕获的变量组?代码主体是否有很多多余的副本?我是否应该标记每个通过function传递的const&对象,以便不进行复制:

void func( const function< void (int arg) >& f ) {
}

或者函数对象以某种方式与常规C ++结构传递不同?

通过lambda在c ++ 11中非常容易:func([](int arg){//代码});但是我想知道,将lambda传递给这样的函数的成本是多少?如果func将lambda传递给...

c++ c++11 lambda parameter-passing std-function
3个回答
32
投票

Disclaimer:


3
投票
另请参阅C++11 lambda implementation and memory model

lambda表达式就是这样:一个表达式。编译后,将在运行时导致关闭对象。

5.1.2 Lambda表达式[expr.prim.lambda]


1
投票
如果可以将lambda作为一个简单函数(即它不捕获任何东西),则它的制作方法完全相同。尤其是作为标准要求,它必须与具有相同签名的旧式函数指针兼容。 [编辑:它不准确,请参见评论中的讨论]

其余部分取决于实施,但我不用担心。最简单的实现只是携带信息。与您在捕获中所要求的完全一样。因此,效果与手动创建类的效果相同。或使用一些std :: bind变体。

© www.soinside.com 2019 - 2024. All rights reserved.