为什么这可以让我获得一个指向常量对象字段的非常量指针

Why does this let me get a non-const pointer to a field of a const object?

本文关键字:常量 一个 对象 字段 指针 非常 为什么      更新时间:2023-10-16

我正在用clang++编译这个片段("Apple clang版本4.1(tags/Apple/crang-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);
    }
};

它编译得很好。我很惊讶,因为PointerToOffsetconst限定符,但返回值是非const unsigned char指针。

我还可以确保它返回pages内存范围内的值,这意味着我得到了一个指向实际const对象数据的实际非const指针,而不是指向目标数组最终副本的悬挂引用。

结果似乎是一个const错误的方法,尽管如此,它还是编译了。是什么使它合法?

用最简单的话来说,变量

MemoryPage* pages;

将变为:

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

在您的const函数中:PointerToOffset()

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

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

相关文章: