#c #qt #copy-on-write
#c #qt #копирование при записи
Вопрос:
Итак, известно, что этот код не имеет смысла:
const int foo()
{
int n = // do computation...;
return n;
}
Потому что какой смысл возвращать «const int», когда он все равно копируется?
Но с классами с неявным общим доступом (COW), такими как контейнеры Qt, это снова имеет смысл? Рассмотрим:
const QList<mytype> get_list()
{
QList<mytype> lst;
// do stuff to fill list;
return lst;
}
Теперь я могу сделать:
const QList<mytype> mylst = get_list();
Поскольку Qt имеет неявный общий доступ к контейнерам, он должен работать нормально, потому return lst
что на самом деле не копирует содержимое списка, просто увеличьте refcount и const
убедитесь, что я не могу его изменить (если get_list
хотите убедиться в этом по какой-то причине или это должен быть const
сам метод). Правильно ли я здесь думаю?
Комментарии:
1. @Dennis: я в основном спрашиваю, верны ли все предположения, которые я перечислил в вопросе
Ответ №1:
и const убедитесь, что я не могу его изменить… Правильно ли я здесь думаю?
Я не мог понять весь вопрос. Но приведенная выше часть неверна. Вы возвращаете только const
значение из функции, и это не обязывает принимающую сторону также быть a const
. Таким образом, удаление const
из mylst
разрешено, и оно снова становится изменяемым.
/* const */ QList<mytype> mylst = get_list(); // ok! 'mylst' is modifiable
Комментарии:
1. Почему это так? Почему const не является обязательным на принимающей стороне?
2. @zaharpopov, как вы продемонстрировали
const int
, может быть скопированint
и изменен. То же правило применяется и здесь. Если вы хотите сделать его немодифицируемым, вам, возможно, придется перегрузить его конструктор копирования и оператор присваивания.3. @zaharpopov: Конструкция копирования (в большинстве случаев) принимает
const
ссылку (в данном случае вашуconst QList<mytype>amp;
) и создает новый объект, который может бытьconst
или нет.