C++ const成员函数返回指针数组引用的编译报错问题
报错根因
这个问题本质是指针的顶层const和底层const修饰位置混淆导致的类型不匹配:
- 首先明确规则:类的const成员函数内部,所有非静态成员都会被自动加上顶层const(即成员本身不可修改)。
- 先看正常运行的方法(1):
它的私有成员是Shape shapes[100],元素是普通的Shape对象。在const成员函数中,这个数组的类型会被推导为const Shape [100],你声明的返回值是const Shape (&)[100](指向const Shape数组的引用),类型完全匹配,因此编译通过。 - 再看出错的方法(2):
它的私有成员是Tile* tiles[16],属于指针数组,每个元素是Tile*指针类型。在const成员函数中,这个数组的类型会被推导为Tile* const [16]:- 这里的const是顶层const,修饰的是指针本身:意味着数组里的每个指针不能指向新的地址,但指针指向的
Tile对象是可以修改的。
而你写的返回类型const Tile* (&)[16]的含义是:指向「元素为const Tile*类型的数组」的引用,这里的const是底层const,修饰的是指针指向的内容:意味着数组里的指针可以指向新地址,但指针指向的Tile对象不可修改。
两个类型的const修饰对象完全不同,编译器会判定你试图丢弃原本的顶层const限定符,因此抛出匹配错误。
- 这里的const是顶层const,修饰的是指针本身:意味着数组里的每个指针不能指向新的地址,但指针指向的
修复方案
如果你只需要保证const成员函数中指针本身不可修改,正确写法如下:
Tile* const (&getTiles() const)[16]{return tiles;};
如果你需要同时限定指针指向的Tile对象也不可修改,需要同时加顶层和底层const:
const Tile* const (&getTiles() const)[16]{return tiles;};
内容的提问来源于stack exchange,提问作者KKYGG
相关产品推荐
相关产品推荐

