使用for_each与Lambda改写C++ Primer习题代码报错求助
问题解答:for_each结合Lambda调用allocator::destroy报错的原因
我来帮你拆解下这个问题的核心原因,以及给出对应的解决办法:
首先你遇到的本质问题是:for_each传递给Lambda的参数类型和你预期的完全不一样。
你代码里的elements、first是string*类型的指针,当把它们当作迭代器传给for_each时,for_each会对每个迭代器执行解引用操作——也就是说,它传给Lambda的参数是string&(指针指向的string对象的引用),而不是你写的string*。这就直接导致了VS2017报错里的类型不匹配:无法把std::string(也就是报错里的_Ty)转换成std::string*。
而你手动用while循环的写法能正常运行,是因为你直接把string*类型的p传给了Lambda,和Lambda的参数类型完全匹配,自然不会有类型问题。
正确的for_each + Lambda写法
你只需要调整Lambda的参数类型,或者用auto自动推导,再把对象的地址传给alloc.destroy即可:
写法一:明确参数类型
for_each(elements, first, [](string& str) { alloc.destroy(&str); });
写法二:用auto自动推导(更通用)
for_each(elements, first, [](auto& str) { alloc.destroy(&str); });
另外提个小细节:你原代码里的双重if (elements)是冗余的,只需要一层判断就够了,毕竟两次判断的条件完全一致。
内容的提问来源于stack exchange,提问作者codesavesworld
相关产品推荐
相关产品推荐

