const引用指针可以改变对象

时间:2016-12-22 08:11:08

标签: c++ pointers reference const

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,或者像一个容易犯的错误。是否有一种简单的方式来声明一个真实的&#34; const引用指针?如:确保对象本身是const。

编辑:假设我不能只改变unique_ptr的类型。一个现实世界的场景是,某些对象是在vector<unique_ptr<C>>中构造的,而某些函数会获得对其中一个元素的(const)引用。

1 个答案:

答案 0 :(得分:4)

const中的const std::unique_ptr<TinyClass>& constRef可确保constRef在设置后不会指向其他对象。它与对象本身无关。

如果您想阻止更改对象本身:

std::unique_ptr<const TinyClass> ptr_to_const_object;

编辑(在OP编辑之后):

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