возвращает постоянный автоматический объект — и неявное совместное использование Qt

#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 или нет.