Jan*_*oux 3 c++ vector c++11 visual-studio-2013
考虑这个课程:
#include <vector>
using namespace std;
template<typename T>
class Vector{
private:
size_t size_;
vector<T> 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<bool> vec;
vec.push_back( true );
if( vec[0] )
vec[0] = false;
}
Run Code Online (Sandbox Code Playgroud)
使用MSVS 2013进行编译时,非const运算符[]会出现以下错误: error C2440: 'return' : cannot convert from 'std::_Vb_reference<std::_Wrap_alloc<std::allocator<char32_t>>>' to 'bool &'
更改return语句会return (T&)(items[i]);导致警告warning C4238: nonstandard extension used : class rvalue used as lvalue
程序运行(在调试模式下),但最后一个语句不会改变vec[0](如你所期望的rhv)的值.
这有什么不对?
因为std::vector<bool>是特殊的,它是一个节省空间的专业化的std::vector该类型bool.并且operator[]不会返回bool&或者const bool&,而是代表对单个引用的代理类bool.
将类暴露
std::vector<bool>::reference为访问单个位的方法.特别是,此类的对象operator[]由value 返回.