c++ - 在包含 vector<bool> 的类中重新定义运算符 []

标签 c++ vector operators

我在我的类中重新定义 operator[] 时遇到问题,该类将 vector 作为私有(private)成员。所以计划是让 bool vector 只包含真值或假值。这是您可以理解我遇到的问题的最少代码。

class A{
   private:
     std::vector<bool> _object;
   public:
   bool& operator[](size_t i) {return _object[i];};
   };

编译器错误是: 对 bool 类型的非成本左值引用不能绑定(bind)到临时的“引用”(又名“std::_Bit_reference”)

我不明白 _object[i] 在这种情况下怎么会是临时的。

最佳答案

与众不同std::vector<T> , std::vector<bool>::operator[]不返回 T& (在本例中为 bool& ),但某些实现定义的引用代理类不需要(并且在您的平台上也不能)绑定(bind)到 bool& .这是因为 std::vector<bool>允许成为 std::vector 的空间高效特化而不是你天真的数组 bool秒。有关引用,请参阅 this .

这被标准委员会广泛认为至少是一个糟糕的名称选择,因为它打破了人们在查看 std::vector 时的合理预期。 .

不幸的是,没有惯用的修复方法。如果你想要正常 std::vector行为,您可能需要编写一个小包装类或只使用 std::vector<char>反而。我知道这两者都不愉快,我强烈认为引入特化是一个错误。

如果可能,您可以使用boost::container::vector<bool>而不是 std::vector<bool> .幸运的是,Boost 没有重复那个不方便的错误,并给了节省空间的变体 proper name相反。

关于c++ - 在包含 vector<bool> 的类中重新定义运算符 [],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34667014/

相关文章:

c++ - 错误 : invalid instruction suffix for `cmpxchg'

c++ - 在 GPU 中共享许多 Gauss-Legendre 正交的根和权重

math - 向量数学,在两个向量之间的平面上找到坐标

javascript - 使用 Javascript 将运算符(+、-、*、/)应用于东方阿拉伯数字

c++ - 全局运算符和多态性

perl - 在Perl中'eq'和'=〜'有什么区别?

c++ - 避免 std::list 中的指针

c++ - 递归创建——nested()

python - numpy 矩阵向量乘法

c++:在 vector 中搜索