operator[] 编译器错误和警告

Posted

技术标签:

【中文标题】operator[] 编译器错误和警告【英文标题】:operator[] compiler error and warning 【发布时间】:2015-06-30 05:22:36 【问题描述】:

可能是因为我整夜没睡……但有人能解释一下为什么第一个 operator[](const 的)在 MSVC 2010 中生成警告说我正在返回临时地址变量,并且第二个 operator[](非常量)产生编译器错误,说明:'return' : cannot convert from 'std::_Vb_reference<_alloc>' to '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;

    ;

【问题讨论】:

我立即注意到的一件事是,在第二个函数中,您的参数是“att”,但您将“ii”索引到数组中。 std::vector&lt;bool&gt; 实际上在 C++ 中被视为一种特殊情况。 This answer 应该有助于解释原因。 非常感谢 huu 提供的有用链接 :) 【参考方案1】:

std::vector&lt;bool&gt; 在大多数实现(g++,MSVC)中是节省空间的:每个项目都可以存储为单个位,而不是布尔值。你可以在这里阅读更多:en.cppreference.com

你有两个选择:

    使用std::vector&lt;unsigned char&gt;(或其他整数类型)代替std::vector&lt;bool&gt;

    使用std::vector&lt;bool&gt;::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;
    
    ;
    

【讨论】:

考虑到 _atts 向量是静态的(必须始终具有相同的维度......九,它非常小)最好的选择是使用一个好的旧 c 数组。无论如何,您的解决方案也很好:) 非常感谢!【参考方案2】:

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

    ;

【讨论】:

以上是关于operator[] 编译器错误和警告的主要内容,如果未能解决你的问题,请参考以下文章

编译器错误 C2280,试图引用已删除的函数 operator=

为啥来自 IBM XL C/C++ 编译器的警告?

警告:编译器可以假设‘x’的地址永远不会为NULL

Boost interprocess flat_map operator[] 编译错误

VS2012的错误警告问题

Babel 编译错误 SyntaxError: Unexpected token when using spread operator