0

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

4

1 に答える 1

3

変数を簡単に言えば、

MemoryPage* pages;

次のようになります。

MemoryPage* const pages;  // and not `const MemoryPage*`
//          ^^^^^

関数内const: PointerToOffset().

の意味constは、クラス変数は変更できないということです。pages変更不可能なエンティティを作成するには、 が指すコンテンツではなく、それ自体constに適用する必要があります。 そのため、コンパイラにエラーはありません。pages

理解のために、簡単に as を宣言してみると、pagesconstconst MemoryPage*以外の関数でもコンパイラがエラーを出力することがわかります。

于 2013-02-12T06:06:20.487 に答える