【发布时间】:2018-11-08 00:27:41
【问题描述】:
我有以下代码 sn-p,它采用 std::vector<int> list 并在所有向量元素中写入零。这个例子工作得很好。
#include <vector>
#include <iostream>
#include <algorithm>
int main () {
std::vector<int> list {1, 1, 2};
auto reset = [](int & element){element = 0;};
auto print = [](int element) {std::cout << element << " ";};
std::for_each(list.begin(), list.end(), reset);
std::for_each(list.begin(), list.end(), print);
}
如果我将向量的类型从int 更改为bool,代码将无法编译。
#include <vector>
#include <iostream>
#include <algorithm>
int main () {
std::vector<bool> list {true, true, false};
auto reset = [](bool & element){element = false;};
auto print = [](int element) {std::cout << element << " ";};
std::for_each(list.begin(), list.end(), reset);
std::for_each(list.begin(), list.end(), print);
}
我不明白编译器错误信息:
/opt/compiler-explorer/gcc-7.2.0/lib/gcc/x86_64-linux-gnu/7.2.0/../../../../include/c++/7.2.0/ bits/stl_algo.h:3884:2: 错误: 没有匹配函数调用类型为 '(lambda at :7:18)'
__f(*__first); ^~~:10:10: 注意:在函数模板的实例化中 专业化 'std::for_each:7:18)>' 在这里请求
std::for_each(list.begin(), list.end(),reset); ^:7:18: 注意:候选函数不可行:未知 从 'std::_Bit_iterator::reference' 转换(又名 'std::_Bit_reference') 到 'bool &' 作为第一个参数
auto reset = [](bool & element){element = false;}; ^:7:18: 注意:'void (*)(bool &)' 类型的转换候选
为什么std::foreach 可以与std::vector<int> 一起使用,但不能与std::vector<bool> 一起使用?
std::vector<bool>(见here)的内存优化是答案的一部分吗?
【问题讨论】:
-
std::vector<bool>的迭代器类型在取消引用时不返回bool&。相反,它返回一个代理对象。使用auto&而不是bool&来获取代理。 -
@Incomputable:请不要将答案放在 cmets 部分。
标签: c++ vector foreach boolean