【问题标题】:Pass anonymous function object to std::function?将匿名函数对象传递给 std::function?
【发布时间】:2014-12-02 14:40:28
【问题描述】:

这是我的问题: 我定义了一个函子:

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);

结果是对的。 那么,为什么会这样呢?请帮助我理解它。谢谢。

【问题讨论】:

    标签: c++ c++11 most-vexing-parse


    【解决方案1】:
    Fun f(A());
    

    这是most-vexing parse 的情况。它声明了一个函数f,它返回一个Fun。它接受一个函数指针作为参数,指向一个不带参数的函数并返回一个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
    

    或者你做过的一件事。

    【讨论】:

    • 你打败了我。确实是最令人头疼的解析问题。
    • 有时,计算机科学中的术语以误导的方式命名。这不是那些时代之一。
    猜你喜欢
    • 1970-01-01
    • 2015-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-13
    • 1970-01-01
    • 1970-01-01
    • 2017-03-22
    相关资源
    最近更新 更多