为什么这可以让我获得一个指向常量对象字段的非常量指针
Why does this let me get a non-const pointer to a field of a const object?
我正在用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);
}
};
它编译得很好。我很惊讶,因为PointerToOffset
有const
限定符,但返回值是非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*
,您就会注意到编译器即使在非常量函数中也会发出错误。
相关文章:
- 用C++中的一个变量定义一个常量
- 我想将一个对T类型的非常量左值引用绑定到一个T类型的临时值
- 有没有什么方法可以使用一个函数中定义的常量变量,也可以由c++中同一程序中的其他函数使用
- 当一个值是非常量但用常量表达式初始化时使用constexpr
- 是否可以同时声明一个类成员的常量/非常量?
- 为什么C++在将一个对象复制到另一个对象时需要对这两个对象进行低级常量限定
- 分离一个静态常量 std::thread?
- 从另一个静态常量数组初始化静态常量数组(只需少量计算)
- 一个模板方法,用于同时接受常量和非常量参数
- 我正在将一个 std::string 传递给一个 boost 函数,该函数对该类型进行常量引用,但该值发生了变化
- 常量shared_ptr:我需要两个还是只需要一个
- C++:实现一个全局常量,其值由用户给出
- 为什么不建议使用宏符号常量定义一个固定长度的数组呢
- 给定一个右值,为什么移动ctor比常量复制ctor更匹配
- 静态常量与常量局部变量,哪一个性能更好
- 如何为包含另一个类实例的数组制作常量 getter?
- 编译器错误:函数调用在常量表达式中必须有一个常量值
- 通过像printf这样的可变参数函数传递一个带有常量字符*转换函数的类
- 有没有办法声明一个公共静态常量,该常量将使用 constexpr 在源文件中定义(有什么区别)?
- 我有非常量ID3D11ShaderResourceView*,而DirectX函数需要常量一个