[英]“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.