我正在用clang ++编译这个片段(“Apple clang 4.1版(标签/ Apple / clang-421.11.66)(基于LLVM 3.1svn)”),尽管GCC也做得很好:
#include <iostream>
struct Foo
{
typedef unsigned char MemoryPage[0x1000];
MemoryPage* pages;
Foo() { pages = new MemoryPage[16]; }
~Foo() { delete[] pages; }
unsigned char* PointerToOffset(unsigned offset) const
{
return pages[offset >> 12] + (offset & 0xfff);
}
};
它编译得很好。我很惊讶因为PointerToOffset
具有const
限定符,但返回值是非const
unsigned char
指针。
我还可以确保它返回pages
内存范围内的值,这意味着我得到一个实际的非const
指向实际const
对象数据的指针,而不是悬挂引用目标数组的最终副本。
结果似乎是一个const-wrong方法,但仍然可以编译。什么使它合法?
答案 0 :(得分:3)
简单来说就是变量
MemoryPage* pages;
将变为:
MemoryPage* const pages; // and not `const MemoryPage*`
// ^^^^^
在const
函数内:PointerToOffset()
。
const
的含义是无法修改类变量 。要使pages
成为不可变的实体,const
必须应用于pages
本身,而不是其指向的内容。
这就是编译器中没有错误的原因。
为了便于理解,simpy尝试将pages
声明为const MemoryPage*
,然后您会注意到编译器即使在非const函数中也会发出错误。