理解const

Ant*_*nio 1 c++ pointers const reference c++14

如果你想编写一个迭代器,你通常会写

T* operator->() const;
Run Code Online (Sandbox Code Playgroud)

我的问题是用指针和引用理解这个"const".

例如,您可以编写以下结构:

struct A{
   int* x;

   A(int& x0):x{&x0}{}
   int* ptr() const {return x;}
   int& ref() const {return *x;}
};
Run Code Online (Sandbox Code Playgroud)

你可以这样使用它:

int x = 10;
const A a{x};

int& r = a.ref();
int* p = a.ptr();

*p = 4;
cout << x << endl;   // prints 4

r = 25;
cout << x << endl;  // prints 25
Run Code Online (Sandbox Code Playgroud)

但是为什么这个编译并正常工作(至少用g ++和clang).为什么?

正如我所定义

const A a{x};
Run Code Online (Sandbox Code Playgroud)

这个"a"是const.所以我打电话的时候

int* p = a.ptr();
Run Code Online (Sandbox Code Playgroud)

我用const对象调用ptr(),因此内部指针A-> x必须是"int*const".但是我返回一个没有const的"int*".为什么这是正确的?

参考会发生什么?如果我用"const A"调用A :: ref(),这个函数返回的类型是什么?像"int&const"之类的东西??? <---我想这与"int&"相同.

谢谢你的帮助.

Bar*_*rry 10

按位const和逻辑const之间有不同.

如果您有const A,则无法修改其int*成员.但有修改部件本身(之间的差,其 intx点),并通过构件修改(的值intx指向).那些是不同的const.在最简单的情况下:

struct Ptr { int* p; };

int i = 42;
const Ptr ptr{&i};
*ptr.p = 57; 
Run Code Online (Sandbox Code Playgroud)

ptr.p仍指向i,没有任何改变,所以const机制是强制执行的.但它并不符合逻辑,const因为你仍然通过一个const对象改变了一些东西.尽管如此,该语言并未对您强制执行.作为图书馆作家,这取决于你.

如果要传播 const -ness,只需提供逻辑上的接口const:

int const* ptr() const {return x;}
int const& ref() const {return *x;}
//  ^^^^^
Run Code Online (Sandbox Code Playgroud)

现在,用户无法通过您的位置const A(无法更改x指向的内容)和逻辑(无法更改该指针的值)进行修改.