繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM