2016-12-22 2 views
3

ссылки 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, или как легкая ошибка. Есть ли простой способ объявить «реальную» ссылку на указатель? Как и в: обеспечивает сам объект const.

изменить: предположим, что я не могу просто изменить тип unique_ptr. Сценарий реального мира будет состоять в том, что некоторые объекты построены в vector<unique_ptr<C>>, а некоторые функции получают ссылку (const) на один из ее элементов.

+4

Просто используйте 'std :: unique_ptr '. – Petr

+0

Еще хуже: вы можете изменить ссылочную переменную-член const-объекта. – stefaanv

+0

Этот первый фрагмент выглядит очень подозрительным. Попробуйте присвоить что-либо i. –

ответ

3

const в const std::unique_ptr<TinyClass>& constRef гарантирует, что constRef не укажет на другой объект после его установки. Это не имеет никакого отношения к самому объекту.

Если вы хотите, чтобы предотвратить изменение самого объекта:

std::unique_ptr<const TinyClass> ptr_to_const_object; 

Edit (после редактирования параметров порядка):

Вы ничего не можете сделать. Поскольку есть функция, которая хочет const vector<unique_ptr<C>>&, функция ясно говорит вам, что ей нужно играть с объектом внутри указателя (и даже с указателем), но ему не нужно менять элементы вектора (например, добавлять новый элемент или удалять его) ,

+0

Правильно, это был бы простой способ. Но в моем реальном случае использования объект находится в векторе unique_ptrs. Я не могу это изменить. Функция получает ссылку (const) на один из этих объектов. Вот где я нашел, что const не означает, что кажется – Basti

+0

Вы можете отредактировать свой вопрос в реальном случае. –

+0

@bast Я отредактировал свой ответ –

Смежные вопросы