0

我正在用 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);
    }
};

它编译得很好。我很惊讶,因为PointerToOffsetconst限定符,但返回值是非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自身,而不是它所指向的内容。
这就是编译器没有错误的原因。

为了理解起见,简单尝试声明pagesconst MemoryPage*,然后您会注意到编译器即使在非常量函数中也会发出错误。

于 2013-02-12T06:06:20.487 回答