将匿名函数对象传递给std::function?

9

这里是我的问题: 我定义了一个函数对象:

class A { 
 public: 
   int operator()(int a, int b) const{
    return a + b;
   }
 };
typedef function<int (int, int)> Fun;

然后我使用一个匿名函数对象来创建一个std::function对象,结果发现有些奇怪。这是我的代码:

Fun f(A());
f(3, 4);

很遗憾,这是错误的。错误信息如下:
error: invalid conversion from ‘int’ to ‘A (*)()’ [-fpermissive]
error: too many arguments to function ‘Fun f(A (*)())’

然而,当我将代码更改为以下内容时:
A a;
Fun f(a);
f(3, 4);

或者
Fun f = A();
f(3, 4);

结果是正确的。 那么,为什么呢?帮我理解一下,谢谢。
1个回答

13
Fun f(A());

这是一个最具烦恼的解析案例。它声明了一个返回Fun的函数f,它需要一个指向不带参数并返回A的函数指针作为参数。
有几种方法可以解决这个问题:
Fun f{A()};    // Uniform-initialisation syntax
Fun f{A{}};    // Uniform-initialisation on both objects
Fun f((A()));  // Forcing the initialiser to be an expression, not parameter list

或者你所做的事情之一。


你比我快了,的确是最棘手的解析问题。 - luis.espinal
有时候,计算机科学中的术语会被命名为具有误导性的方式。但这并不是那种情况。 - Yakk - Adam Nevraumont

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接