类operator []不返回lhv

时间:2015-12-31 16:36:31

标签: c++ c++11 vector 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;
}

使用MSVS 2013进行编译时,非const运算符[]会出现以下错误:error C2440: 'return' : cannot convert from 'std::_Vb_reference<std::_Wrap_alloc<std::allocator<char32_t>>>' to 'bool &'

更改return (T&)(items[i]);中的return语句会产生警告warning C4238: nonstandard extension used : class rvalue used as lvalue

程序运行(在调试模式下),但最后一个语句不会更改vec[0]的值(正如您对rhv所期望的那样)。

这里有什么问题?

1 个答案:

答案 0 :(得分:6)

由于std::vector<bool>很特殊,因此对于std::vector类型来说,它是bool的节省空间的特化operator[]不会返回bool&const bool&,而是代表对单个bool的引用的代理类。

  

公开类std::vector<bool>::reference作为访问单个位的方法。特别是,此类的对象由operator[]按值返回。