const引用指针可以更改对象

const reference to a pointer can change the object

本文关键字:对象 引用 指针 const      更新时间:2023-10-16

const引用确保无法更改所指的对象。例如:

int i = 1;
const int& ref = i;
ref = 42; // error, because of a const reference

但是,如果您使用指针或unique_ptr的引用,则可以。示例:

class TinyClass {
public:
    int var = 1;
    void f1() { var = 42; }
};
std::unique_ptr<TinyClass> pointer(new TinyClass);
const std::unique_ptr<TinyClass>& constRef = pointer;
constRef->f1(); // no error

我认为这是因为指针本身没有更改。但这感觉是misleading,或者像一个简单的错误。是否有一种简单的方法来声明指针的"真实"句子?如:确保对象本身为const。

编辑:假设我不能只是更改unique_ptr的类型。现实世界的情况是,某些对象是在vector<unique_ptr<C>>中构造的,并且某些函数获取了其元素之一的(const)引用。

const std::unique_ptr<TinyClass>& constRef中的const保证constRef设置后不会指向另一个对象。它与对象本身无关。

如果要防止更改对象本身:

std::unique_ptr<const TinyClass> ptr_to_const_object;

编辑(OP的编辑之后):

您无能为力。由于有一个需要const vector<unique_ptr<C>>&的函数,因此该函数清楚地告诉您,它需要使用指针内的对象(甚至指针)播放,但它不需要更改向量项目(例如添加新项目或删除它)。