考虑这个课程:
#includeusing namespace std; template class Vector{ private: size_t size_; vector items; public: Vector(){ size_ = 0; } inline void clear(){ size_ = 0; } inline void push_back( const T item ){ if( items.size() == size_ ) items.push_back( item ); else items[size_] = item; size_++; } inline const T& operator[](int i) const { return items[i]; } inline T& operator[](int i) { return items[i]; } }; int main(int argc, char *argv[]){ Vector vec; vec.push_back( true ); if( vec[0] ) vec[0] = false; }
使用MSVS 2013进行编译时,非const运算符[]会出现以下错误: error C2440: 'return' : cannot convert from 'std::_Vb_reference
更改return语句会return (T&)(items[i]);
导致警告warning C4238: nonstandard extension used : class rvalue used as lvalue
程序运行(在调试模式下),但最后一个语句不会改变vec[0]
(如你所期望的rhv)的值.
这有什么不对?
因为std::vector
是特殊的,它是一个节省空间的专业化的std::vector
该类型bool
.并且operator[]
不会返回bool&
或者const bool&
,而是代表对单个引用的代理类bool
.
将类暴露
std::vector
为访问单个位的方法.特别是,此类的对象::reference operator[]
由value 返回.