vector <bool> specialization与</bool>的范围基础不兼容

时间:2014-08-08 00:30:29

标签: c++ c++11

我无法使用g ++或clang

编译以下代码段
void foo(vector<bool>& p)
{
    for( auto& b : p )
        b=true;
}

我知道有/曾经vector<bool>专业化。
这是一个已知的错误?或者标准是否例外?
或者我错过了一些简单的东西?

g ++给了我以下内容:

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}

clang给出:

error: non-const lvalue reference to type 'std::_Bit_reference' cannot bind to a
temporary of type 'reference' (aka 'std::_Bit_reference')

1 个答案:

答案 0 :(得分:12)

取消引用迭代器时,

std::vector<bool>返回临时代理对象。这意味着您必须使用autoauto&&const auto&而不是auto&,因为您无法将临时值绑定到非const l-价值参考。

例如,这可以并且将打印所有1

#include <iostream>
#include <vector>

void foo(std::vector<bool>& p)
{
    for(auto&& b : p) {
        b = true;
    }
}

int main() {
    std::vector<bool> p = { true, false, true, true };
    foo(p);
    for(const auto& b : p) {
        std::cout << b << '\n';
    }
}

Live Demo