gpt4 book ai didi

C++ lambda 不推断函数重载

转载 作者:行者123 更新时间:2023-12-03 06:51:38 25 4
gpt4 key购买 nike

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

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++ 输出是:
I get this error in Visual C++
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 Demo
class 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com