对类型为 std::_Bit_rerefence& 的非常量引用的初始化无效

Invalid initialization of non-const reference of type std::_Bit_rerefence&

本文关键字:常量 非常 引用 无效 初始化 rerefence 类型 std Bit      更新时间:2023-10-16

Uhm,我正在编写一段代码,将两个字符串转换为一个位集(不幸的是,由于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();
}
};

甚至它们看起来也违反直觉。