如何获取std::bitset中某个位的左值引用



我试图执行以下操作:

std::bitset<2000> a_bit_set{};
auto& a_bit = a_bit_set[5];
if (complicated_predicate(a_bit, other_params))
{
a_bit.flip();
}

但是clang抱怨道:

non-const lvalue reference to type 'std::bitset<2000>::reference' cannot bind to a temporary of type 'std::bitset<2000>::reference'

我怀疑这是因为operator[]在这里返回的是右值而不是左值。但根据cppreference,有一个特殊的类std::bitset<>::reference应该允许我引用位集中的特定位。我的问题是:我可以获得对位集中特定位(也称为std::bitset<>::reference(的左值引用吗

如何在std::bitset 中获取对位的左值引用

你没有。std::bitset不包含任何表示单个位的对象,因此您不能引用此类对象。

又名std::bitset<>::reference

std::bitset<>::reference不是左值引用。它是一个对象——一个引用包装器。下标运算符将该对象作为prvalue返回。您可以简单地使用引用包装器的副本,如下所示:

auto a_bit = a_bit_set[5];

或者,您可以使用一个重新值引用来延长prvalue的使用寿命:

auto&& a_bit = a_bit_set[5];

我不会在这个例子中使用后者,因为它引入了不必要的复杂性。但是,在涉及引用别名的模板的其他一些情况下,它可能很有用,该引用别名可能是真正的引用,也可能是引用包装器,具体取决于模板参数。

最新更新