このスニペットをclang ++でコンパイルしています(「Apple clangバージョン4.1(tags/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 が正しくないメソッドのようです。何が合法なのですか?