[英]invalid initialization of non-const reference of type ‘std::vector<Object*>&’
[英]Invalid initialization of non-const reference of type std::_Bit_rerefence&
嗯,我正在编写一个将两个字符串转换为位集的代码(不幸的是,由于它的编译时模板常量大小要求, 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
是一个代理 class。
代理 class 表示对单个布尔值的引用
您可以改用右值引用。 例如
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();
}
};
即使他们看起来违反直觉。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.