我在我的类中重新定义 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/