在包含vector <bool>的类中重新定义operator []

时间:2016-01-07 23:23:48

标签: c++ vector operators

我遇到了在我的类中重新定义operator []的问题,它将vector作为私有成员。所以计划是有bools的向量,它只包含真值或假值。这是最简单的代码,你可以理解我的问题。

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

编译器错误是: 对bool类型的非成本左值引用不能绑定到临时的&#39;引用&#39; (又名&#39; std :: _ Bit_reference&#39;)

我不明白_object [i]在这种情况下是暂时的。

3 个答案:

答案 0 :(得分:4)

与其他merged_list不同,merged_list: - { name: foo, value: jigsaw } - { name: bar, value: crossword } - { name: baz, value: monkey } 不返回std::vector<T>(在本例中为std::vector<bool>::operator[]),但是某些实现定义的引用代理类不需要(和,在您的平台上,无法绑定到T&。这是因为bool&被允许是bool&的空间效率专门化,而不是std::vector<bool>的天真数组。有关参考,请参阅this

这被广泛认为至少是标准委员会对名称的不良选择,因为它打破了人们在查看std::vector时合理拥有的期望。

不幸的是,没有惯用的修复方法。如果您想要正常的bool行为,您可能需要编写一个小的包装类或只使用std::vector。我知道这些都是令人不愉快的,我强烈想要介绍专业化是一个错误。

如果可能,您可以使用std::vector代替std::vector<char>。幸运的是,Boost没有重复这个不方便的错误,而是给了空间有效的变体proper name

答案 1 :(得分:1)

这是因为只有std :: vector&lt; bool&gt; STL优化存储容量,使每个值存储在一个位中。但是C ++中对象的最小大小是sizeof(char)。因此库需要构造对象,引用将是临时的。

答案 2 :(得分:1)

嗯,你不能真正引用一个特定的位,而char是可寻址内存的最小单位。

std::vector<bool>实施可能与reference documentation的注释中提到的标准容器保证不同:

  

由于其表示可能已经过优化,因此std::vector<bool>不一定符合所有ContainerSequenceContainer要求。例如,因为std::vector<bool>::iterator是实现定义的,所以它可能不满足ForwardIterator要求。使用需要std::search的{​​{1}}等算法可能会导致编译时错误或运行时错误。