运算符[]编译器错误和警告

operator[] compiler error and warning

本文关键字:警告 错误 编译器 运算符      更新时间:2023-10-16

可能是因为我整晚都没睡。。。但是有人能解释一下为什么第一个运算符[](const运算符)在MSVC 2010中生成一个警告,说我正在返回一个temorary变量的地址,而第二个操作符[](非常数运算符)生成一个编译器错误,说明:"return":无法从"std::_Vb_reference&lt_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;
    };

std::vector<bool>在大多数实现(g++,MSVC)中都是节省空间的:每个项都可以存储为单个位,而不是布尔。您可以在这里阅读更多信息: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;
    };
    

将参数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;
    };