operator []编译器错误和警告

时间:2015-06-30 05:22:36

标签: c++

可能是因为我整晚都没有睡觉......但是有人可以解释一下为什么第一个操作员[](常规操作员)在MSVC 2010中生成一个警告,说我正在返回一个temorary的地址变量,第二个运算符[](非const运算符)产生一个编译器错误,指出:'return':无法从'std :: _ Vb_reference< _Alloc>'转换'bool&' ?!?!?

非常感谢每个人都会浪费时间在我的问题上。

    class ReqAtts
    {
    public:
        const bool& operator[](size_t ii) const
        {
            return _atts[ii];
        }

        bool& operator[](size_t ii)
        {
            return _atts[ii];
        }

    private:
        std::vector<bool> _atts;

    };

2 个答案:

答案 0 :(得分:1)

std::vector<bool>在大多数实现中都是节省空间的(g ++,MSVC):每个项目可以存储为单个位,而不是bool。您可以在此处阅读更多内容:en.cppreference.com

您有两个选择:

  1. 使用std::vector<unsigned char>(或其他整数类型)代替std::vector<bool>
  2. 使用std::vector<bool>::reference作为operator[]的返回类型,如下所示:

    class ReqAtts
    {
    public:
        std::vector<bool>::const_reference operator[](size_t ii) const
        {
            return _atts[ii];
        }
    
        std::vector<bool>::reference operator[](size_t ii)
        {
            return _atts[ii];
        }
    
    private:
        std::vector<bool> _atts;
    
    };
    

答案 1 :(得分:-1)

将参数att更改为ii,它将起作用

class ReqAtts
    {
    public:
        const bool& operator[](size_t ii) const
        {
            return _atts[ii];
        }

        bool& operator[](size_t ii)
        {
            return _atts[ii];
        }

    private:
        std::vector<bool> _atts;

    };