如何获取std::bitset中指定比特位的左值引用
问题原因
非conststd::bitset的operator[]返回的是std::bitset<N>::reference类型的临时右值对象,C++语法不允许非const左值引用绑定到临时右值,这就是你编译报错的直接原因。
std::bitset<N>::reference是专门设计的代理类,因为C++最小可寻址单元是字节,单个比特位无法返回原生左值引用,所以用这个轻量类来模拟比特位的引用行为。
解决方案
你没办法直接从operator[]的返回值拿到std::bitset<N>::reference类型的左值引用,因为它本身就是按值返回的临时对象。如果确实需要持有该类型的左值引用,可以先把代理对象存为本地左值后再取引用:
std::bitset<2000> a_bit_set{}; // 先把代理对象存为本地左值 auto bit_proxy = a_bit_set[5]; // 此时可以正常绑定左值引用 auto& a_bit = bit_proxy; if (complicated_predicate(a_bit, other_params)) { a_bit.flip(); }
实用建议
实际开发中完全没必要多套一层引用,直接用auto接收operator[]返回的代理对象即可,你对它做的赋值、flip()等操作都会直接同步到原bitset对应的比特位,和使用引用的效果完全一致,也没有额外性能损耗:
std::bitset<2000> a_bit_set{}; auto a_bit = a_bit_set[5]; if (complicated_predicate(a_bit, other_params)) { a_bit.flip(); }
内容的提问来源于stack exchange,提问作者RelativisticPenguin
相关产品推荐
相关产品推荐

