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

时间:2019-11-10 15:21:52

标签: c++ stdvector

嗯,我正在写一个代码,将两个字符串转换为一个位集(不幸的是,loop_list([Element|[]], NewList, Number) :- p(Element, NewList, Number). loop_list([Head|Tail], [Tmp|NewList], Number) :- loop_list(Tail, Tmp, Number). 不能使用,因为它的编译时间模板的大小要求恒定)。

由于某些原因,我无法引用基于范围的循环的迭代:

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

1 个答案:

答案 0 :(得分:2)

std::vector<bool>[1613x30]的特化,它的行为与普通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;
    }
};

即使他们看起来违反直觉。