我正在用 clang++ ("Apple clang version 4.1 (tags/Apple/clang-421.11.66) (based on 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 不正确的方法,但仍然可以编译。是什么让它合法?