为什么这让我得到一个指向const对象字段的非const指针?

时间:2013-02-12 06:00:01

标签: c++ const

我正在用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方法,但仍然可以编译。什么使它合法?

1 个答案:

答案 0 :(得分:3)

简单来说就是变量

MemoryPage* pages;

将变为:

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

const函数内:PointerToOffset()

const的含义是无法修改类变量 。要使pages成为不可变的实体,const必须应用于pages本身,而不是其指向的内容。
这就是编译器中没有错误的原因。

为了便于理解,simpy尝试将pages声明为const MemoryPage*,然后您会注意到编译器即使在非const函数中也会发出错误。