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后:
- 可以正确接收
std::for_each传入的解引用后的字符引用 - 对引用取地址
&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
相关产品推荐
相关产品推荐

