繁体   English   中英

“const方法”编译读取成员变量的错误

[英]“const method” compile error for reading member variable

我想知道为什么我得到第一个“const方法”的编译错误,而第二个是OK。

typedef struct xyz{
    uint16_t xyz1[16];
}XYZ;

class A {
public :
    A() :m_a1(4) { m_a2 = new XYZ[4]; }
    void getSomething() const
    {
        uint16_t* p = m_a1[0].xyz1; //error: invalid conversion from 
                                    //'const uint16_t* {aka const short unsigned int*}' 
                                    //to 'uint16_t* {aka short unsigned int*}'
    }
    voi getSomething2() const
    {
        uint16_t* p = m_a2[0].xyz1; //compile OK
    }
private:
    vector<XYZ> m_a1;
    XYZ*        m_a2;
};

const成员函数中,所有非静态数据成员也被视为const ,然后m_a1变为const vector<XYZ> std::vector::operator[]有一个const重载,所以在const std::vector<XYZ>上执行operator[]你会得到一个const XYZ ; 其成员xyz1变为const ; const uint16_t [16] ,它将衰减到const uint16_t*并且无法隐式转换为uint16_t*

另一方面,对于const成员函数中具有XYZ*类型的数据成员m_a2 ,将变为XYZ* const (注意它不是const XYZ* )。 即指针本身是const ,但不是指针。 然后使用operator[] ,它仍将返回XYZ ,而不是const XYZ 这就是为什么它适用于以下声明。

如果成员函数是const ,则在该方法中访问的所有成员非mutable变量也被视为const,因此编译器将不允许您对const成员数据进行非指向const的指向。 将您的代码更改为此

void getSomething() const
{
    const uint16_t* p = m_a1[0].xyz1; 
    // or simply
    // auto* p = m_a1[0].xyz1
}

在第二个中,指针本身是const,但不是它指向的数据。 所以代替m_a2是一个const XYZ* (它是一个指向const的指针),就像你想的那样,它的XYZ* const是一个const指针。

不同之处在于,在第一个方法中,向量对象是const,因此只使用它的const方法,因此[]运算符返回一个const引用,而成员xyz1也是const。

在第二种方法中,指针m_a2是const,但不是它指向的内存位置。 这就是为什么在第二种情况下你不需要const。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM