You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++ Primer 13.44问题:为什么for_each的lambda不能直接接收char*参数?

问题核心原因

std::for_each的执行逻辑是:对遍历区间内的每一个迭代器,都会执行回调函数(*迭代器),也就是把迭代器解引用后的结果传入你提供的回调函数,而非迭代器本身。
你当前传入std::for_each的两个边界element和end都是char*类型的原生指针(也就是字符数组的迭代器),每次对迭代器解引用得到的是char&类型的字符左值引用,并非char*指针。你最初写的lambda要求接收char*类型参数,类型不匹配,因此触发编译报错。

修改后写法的合理性

标准库allocator的destroy方法要求传入待销毁对象的指针,你把lambda形参改为char& c后:

  1. 可以正确接收std::for_each传入的解引用后的字符引用
  2. 对引用取地址&c刚好能得到对应字符的指针,完全符合destroy方法的参数要求

可选的等价写法

如果你更习惯直接操作指针,也可以不用std::for_each,直接用原生循环实现,逻辑更直观:

void String::free()
{
    for (char* p = element; p != end; ++p) {
        alloc.destroy(p);
    }
    alloc.deallocate(element, end - element);
}

内容的提问来源于stack exchange,提问作者relaxcn

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 02:24:00