嗯,我正在编写一个代码,将两个字符串转换为一个位集(不幸的std::bitset
是,由于其编译时间模板的恒定大小要求,因此无法使用)。
由于某些原因,我无法引用基于范围的循环的迭代:
#include <iostream>
#include <sstream>
#include <vector>
int main()
{
std::string line;
std::getline(std::cin, line);
std::string chips;
std::string pattern;
std::istringstream issline(line);
issline >> chips;
issline >> pattern;
auto toBool = [](const char c) -> bool { return(c == 'B'); };
std::vector<bool> bitchips;
for(auto& i : chips){
bitchips.push_back(toBool(i));
}
std::vector<bool> bitpattern;
for(auto& i: pattern){
bitpattern.push_back(toBool(i));
}
auto flip = [&bitchips]() -> void
{
for(auto& i : bitchips) { //error
i = !i;
}
};
return 0;
}
error: invalid initialization of non-const reference of type 'std::_Bit_reference&' from an rvalue of type 'std::_Bit_iterator::reference {aka std::_Bit_reference}'
到目前为止,正在执行什么程序:
读取用户输入:BBBBNNNB NNNBBBNB
。转换为:11110001 00011101
std::vector<bool>
是的专业std::vector
,与正常的行为不同std::vector
。特别std::vector<bool>::reference
是代理类。
代表对单个布尔值的引用的代理类
您可以改用右值引用。例如
auto flip = [&bitchips]() -> void
{
for(auto&& i : bitchips) {
i = !i;
}
};
要么
auto flip = [&bitchips]() -> void
{
for(auto i : bitchips) {
i = !i;
}
};
要么
auto flip = [&bitchips]() -> void
{
for(auto i : bitchips) {
i.flip();
}
};
即使他们看起来违反直觉。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句