函数指针和std :: function上的模糊重载

时间:2013-07-21 11:07:30

标签: c++11

#include <functional>

void foo(std::function<void()> f) { f(); }
void foo(void (*f)()) { f(); }

int main ()
{
  foo( [](){} );
}
VS编译,gcc和clang抱怨模糊的超载。谁是对的? lambda应该是类类型,因此它和函数指针之间不应该有任何转换。因此VS似乎是对的,不顾一切。但也许我错过了一些东西。

除了将lambda强制转换为任何一种类型之外,还有一种简单的方法来消除调用的歧义吗?

2 个答案:

答案 0 :(得分:4)

lambda创建一个可以被调用的匿名和未指定的对象,它既不是函数指针也不是std::function对象,但可以同时用作函数指针和std::function对象,模糊的过载错误。我会说VS错了。

此外,由于函数指针可用于创建std::function对象,我会说如果你已经有一个std::function函数,则不需要使用带有函数指针的重载参数。

答案 1 :(得分:3)

非捕获lambdas具有对具有相同签名的函数指针的隐式转换。这在第5.1.2章第6节中规定:

  

没有lambda-capture的lambda表达式的闭包类型有一个   public非虚拟非显式const转换函数指针   具有与闭包相同的参数和返回类型的函数   type的函数调用运算符。此转换返回的值   function应该是一个函数的地址,当被调用时,它具有   与调用闭包类型的函数调用操作符的效果相同。