我正在定义一个这样的类:
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;
};
foo 可以有 child ,所以我们的想法是递归地访问 foo 及其所有 child 。当我尝试使用它时,例如。像这样:
foo f;
f.visitWith([&](const foo&) {
// Do something here
});
我得到编译器错误。编译器无法弄清楚该怎么做。我可以通过添加这样的类型转换来使它工作:
foo f;
f.visitWith( (std::function<void(const foo&)>) [&](const foo&) {
// Do something here
});
但这太可怕了。我怎样才能让它整齐地工作?
编辑:
这可能是 Visual C++ 的问题,它拒绝编译此处给出的代码:
https://ideone.com/n9bySW
我尝试编译时的 VC++ 输出是:
Edit2:不,Visual C++ 是正确的,代码不明确。请参阅下面的解决方案...
最佳答案
lambda 是编译器生成的类型,它不是 std::function
的实例,但它可以分配给一个。
您的 visitWith()
方法采用 std::function
通过非常量引用,这意味着它需要预先存在的 std::function
对象,例如:
std::function<void(const foo&)> func = [&](const foo&) {
// Do something here
};
foo f;
f.visitWith(func);
将 lambda 直接传递给 visitWith()
将要求编译器创建一个临时的 std::function
对象,但非常量引用不能绑定(bind)到临时对象。这就是您的原始代码无法编译的原因。对于您正在尝试的内容,您必须通过
std::function
通过值或 const-reference 代替:class foo {
public:
void visitWith(std::function<void(foo&)>);
void visitWith(std::function<void(const foo&)>) const;
};
Live Democlass foo {
public:
void visitWith(const std::function<void(foo&)> &);
void visitWith(const std::function<void(const foo&)> &) const;
};
Live Demo
关于C++ lambda 不推断函数重载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64091573/