gpt4 book ai didi

c++ - 为什么 mem_fn() 提示尝试使用已删除的函数?

转载 作者:行者123 更新时间:2023-11-28 05:29:00 26 4
gpt4 key购买 nike

我有以下片段:

struct Foo {
Foo(int num):num_(num){}
void print_add(int i) const { std::cout << num_+i << '\n'; }
int num_;
};

int main() {
std::vector<Foo*> vpf{ new Foo(3), new Foo(4), new Foo(5) };

auto pfa = std::mem_fn(&Foo::print_add);
int i = 42;

//std::for_each(vpf.begin(), vpf.end(), [&i](const auto& val){val -> print_add(i);});
std::for_each(vpf.begin(), vpf.end(), pfa(&i));

return 0;
}

使用 lambda 表达式的注释代码实际上按我预期的方式工作,打印 45、46、47。使用 mem_fnstd::for_each 的未注释代码导致编译错误 尝试使用已删除的函数

有人可以解释为什么以及如何在这种情况下正确使用 mem_fn 吗?

最佳答案

我看不出您如何从这段代码中获得“尝试使用已删除的函数”错误。代码不准确,或者诊断消息不是列表中的第一个。

此代码中的第一个错误将引用您的 pfa(&i) 子表达式,这是无效的。首先,为了调用 pfa,您必须提供两个参数 - Foo *int 类型- 当您只提供一种 int * 类型时。其次,在 std::for_each 的上下文中,您根本不应该调用 pfa 自己,您应该通过 pfa 本身到 std::for_each

如果您想用“无 lambdaless”的东西替换您的 lambda,例如使用“经典”std::mem_fn 功能对象,它看起来如下

auto pfa = std::mem_fn(&Foo::print_add);
int i = 42;
std::for_each(vpf.begin(), vpf.end(), std::bind(pfa, std::placeholders::_1, i));

或者,使用现已弃用的 C++98 库功能

auto pfa = std::mem_fun(&Foo::print_add);
int i = 42;
std::for_each(vpf.begin(), vpf.end(), std::bind2nd(pfa, i));

(那时候只是……不知何故更有趣。更有趣。Geddit?哈哈哈...)

P.S. 请注意(如评论中的@T.C. 所述),如果您计划在其上使用 std::bind。第一个变体可以重写为

int i = 42;
std::for_each(vpf.begin(), vpf.end(),
std::bind(&Foo::print_add, std::placeholders::_1, i));

关于c++ - 为什么 mem_fn() 提示尝试使用已删除的函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39939114/

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