C++ lambda 不会推导出函数重载

Chi*_*idi 4 c++ lambda overloading

我正在定义一个这样的类:

class foo {
public:
  // I define const and non-const versions of the 'visit' function
  // nb. the lambda is passed by reference
  virtual void visitWith(std::function<void(foo&)>&);
  virtual void visitWith(std::function<void(const foo&)>&) const;
};
Run Code Online (Sandbox Code Playgroud)

foo 可以有孩子,所以我们的想法是递归访问 foo 和所有它的孩子。

当我尝试使用它时,例如。像这样:

foo f;
f.visitWith([&](const foo&) {
  // Do something here
});
Run Code Online (Sandbox Code Playgroud)

我收到编译器错误。编译器不知道该怎么做。

我可以通过添加这样的类型转换来使它工作:

foo f;
f.visitWith( (std::function<void(const foo&)>) [&](const foo&) {
  // Do something here
});
Run Code Online (Sandbox Code Playgroud)

但这太可怕了。

我怎样才能让它整齐地工作?

编辑:

这可能是 Visual C++ 的问题,它拒绝编译此处给出的代码:

https://ideone.com/n9bySW

我尝试编译时的 VC++ 输出是:

我在 Visual C++ 中收到此错误

Edit2:不,Visual C++ 是正确的,代码不明确。请参阅下面的我的解决方案...

Rem*_*eau 7

lambda 是编译器生成的类型,它不是 的实例std::function,但可以分配给一个。

您的visitWith()方法需要一个std::functionby 非常量引用,这意味着它需要一个预先存在的std::function对象,例如:

std::function<void(const foo&)> func = [&](const foo&) {
    // Do something here
};
foo f;
f.visitWith(func);
Run Code Online (Sandbox Code Playgroud)

将 lambda 直接传递给visitWith()需要编译器创建一个临时std::function对象,但非常量引用不能绑定到临时对象。这就是您的原始代码无法编译的原因。

对于您正在尝试的内容,您必须std::function通过值或常量引用传递:

class foo {
public:
    void visitWith(std::function<void(foo&)>);
    void visitWith(std::function<void(const foo&)>) const;
};
Run Code Online (Sandbox Code Playgroud)

现场演示

class foo {
public:
    void visitWith(const std::function<void(foo&)> &);
    void visitWith(const std::function<void(const foo&)> &) const;
};
Run Code Online (Sandbox Code Playgroud)

现场演示