このスニペットを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 が正しくないメソッドのようです。何が合法なのですか?