我无法使用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')
答案 0 :(得分:12)
std::vector<bool>
返回临时代理对象。这意味着您必须使用auto
,auto&&
或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';
}
}