我遇到了在我的类中重新定义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]在这种情况下是暂时的。
答案 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>
不一定符合所有Container
或SequenceContainer
要求。例如,因为std::vector<bool>::iterator
是实现定义的,所以它可能不满足ForwardIterator
要求。使用需要std::search
的{{1}}等算法可能会导致编译时错误或运行时错误。