C++ 没有捕获列表的lambda通常是作为普通函数实现的吗?

C++ 没有捕获列表的lambda通常是作为普通函数实现的吗?,c++,c++11,lambda,C++,C++11,Lambda,这个问题源于另一个问题。似乎带有捕获列表的lambda是通过操作符()实现为本地类的 据我所知,没有捕获列表的lambda可以转换为函数指针,这看起来只是一个普通函数。更重要的是,与普通函数相比,没有捕获列表的lambda没有什么特别之处 同时,我认为没有必要将没有捕获列表的lambda作为普通函数来实现 更重要的是,与普通函数相比,没有捕获列表的lambda没有什么特别之处 尝试获取函数的sizeof,然后从非捕获lambda获取。您会注意到函数没有大小(因此无法编译),而lambda有大小(

这个问题源于另一个问题。似乎带有捕获列表的lambda是通过
操作符()
实现为本地类的

据我所知,没有捕获列表的lambda可以转换为函数指针,这看起来只是一个普通函数。更重要的是,与普通函数相比,没有捕获列表的lambda没有什么特别之处


同时,我认为没有必要将没有捕获列表的lambda作为普通函数来实现

更重要的是,与普通函数相比,没有捕获列表的lambda没有什么特别之处

尝试获取函数的
sizeof
,然后从非捕获lambda获取。您会注意到函数没有大小(因此无法编译),而lambda有大小(几乎总是1)

因此,编译器无法为非捕获lambda生成普通函数。请注意,它可以在as-if规则下为lambda函数创建和实现一个异常,但我不会将其称为普通函数

通过使调用操作符保持静态或处理它(编译器可以做很多我们做不到的事情),到函数指针的转换可以工作

更重要的是,与普通函数相比,没有捕获列表的lambda没有什么特别之处

尝试获取函数的
sizeof
,然后从非捕获lambda获取。您会注意到函数没有大小(因此无法编译),而lambda有大小(几乎总是1)

因此,编译器无法为非捕获lambda生成普通函数。请注意,它可以在as-if规则下为lambda函数创建和实现一个异常,但我不会将其称为普通函数


通过将调用运算符设置为静态或处理它(编译器可以做很多我们做不到的事情),到函数指针的转换可以工作。

与常规函数相比,structure functor的优势在于保持类型,这可能有助于内联:

std::sort(std::begin(v), std::end(v), &function);
必须将&function的值记为
bool(*)(const T&,const T&)
才能允许内联

鉴于:

std::sort(std::begin(v), std::end(v),
          [](const T& lhs, const T& rhs){ return function(lhs, rhs);});

只要有
比较器
,我们就有了这个值。没有额外的工作来记住初始值

与常规函数相比,structure functor的优点是可以保持类型,这可能有助于内联:

std::sort(std::begin(v), std::end(v), &function);
必须将&function的值记为
bool(*)(const T&,const T&)
才能允许内联

鉴于:

std::sort(std::begin(v), std::end(v),
          [](const T& lhs, const T& rhs){ return function(lhs, rhs);});


只要有
比较器
,我们就有了这个值。没有额外的工作来记住初始值

“我认为没有必要将没有捕获列表的lambda作为普通函数来实现。”我经常使用lambda,这样做感觉很舒服。编写一个独立函数并获取地址只是更多的工作要做。它将函数定义和使用分开,这可以通过使用无捕获lambda来避免。所以我有必要使用它;)请不要使用
random
code
markups
。是指编译器还是程序员?
我认为没有必要在没有三重否定的情况下不实现lambda!新纪录@过路人-只有在有人检查时,它必须具有唯一的类型。如果我们所做的只是将lambda转换为函数指针,那么我们如何知道它们是否有不同的类型?无论如何,我的观点应该是,您可以转换为函数指针,而不是函数。“我认为没有必要将没有捕获列表的lambda实现为普通函数。”我经常使用lambda,这样做感觉很舒服。编写一个独立函数并获取地址只是更多的工作要做。它将函数定义和使用分开,这可以通过使用无捕获lambda来避免。所以我有必要使用它;)请不要使用
random
code
markups
。是指编译器还是程序员?
我认为没有必要在没有三重否定的情况下不实现lambda!新纪录@过路人-只有在有人检查时,它必须具有唯一的类型。如果我们所做的只是将lambda转换为函数指针,那么我们如何知道它们是否有不同的类型?无论如何,我的观点应该是你可以转换成函数指针而不是函数。谢谢,所以编译器在幕后做了很多事情。
sizeof
函数是illegal@bigxiao是 啊编译器基本上可以做任何它想做的事情,只要它做的事情和标准所说的一样。@Passenger,嗯,是的,这是我的观点。我的答案有那么不清楚吗?如果你能建议一种更好的方式来表达它,我将不胜感激。我想编译器(作为扩展)可能会允许这样做。至于
sizeof([]{})
,也不能保证为1。这也可能因编译器而异。谢谢,所以编译器在幕后做了很多事情。
sizeof
函数illegal@bigxiao是的,编译器基本上可以做任何它想做的事情,只要它做的事情与标准所说的一样。@Passenger,嗯,是的,这是我的观点。我的答案有那么不清楚吗?如果你能建议一种更好的方式来表达它,我将不胜感激。我想编译器(作为扩展)可能会允许这样做。至于
sizeof([]{})
,也不能保证为1。这也可能因编译器而异。