C++ push_back, конструктор неконстантной копии

У меня есть класс, который я хочу вернуть в двухстороннюю очередь. Проблема в том, что когда я возвращаюсь назад, мне нужно изменить исходный объект, поэтому мне нужен не const copy ctor. Теперь, если я реализую, что вызывается мой const copy ctor. Если я удалил константу ctor, я получаю ошибку компиляции об отсутствии доступных ctors. Как мне реализовать это таким образом, чтобы я мог изменить исходную структуру при ее передаче? Мне нужно изменить его, потому что класс разрушает объекты, когда он выходит за пределы области видимости, и я хотел бы сказать ему не делать этого, когда есть другой экземпляр. Я не могу использовать ускорение, так как моя платформа его не поддерживает.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
0
2 779
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

В зависимости от того, что вы пытаетесь сделать (было бы неплохо получить более подробную информацию), вы можете либо изменить объект до / после вызова push_back, либо написать простой класс-оболочку, который принимает указатель на ваш класс и может быть вставлен в deque. Затем этот объект может делать соответствующие вещи с вашим классом при построении / разрушении / и т. д.

Это неправда, auto_ptr использует неконстантную копию ctor для реализации (плохо) подвижной семантики.

Greg Rogers 14.01.2009 01:36

Вы действительно правы. Я обвинял в быстром отсутствии компилятора / стандарта в Google +, когда ответил на него. Прокляните ложную информацию в Интернете!

hazzen 14.01.2009 18:05
Ответ принят как подходящий

Ваша проблема в том, что фундаментальным требованием к стандартным контейнерам является возможность копирования объектов. Это не только означает, что у них есть конструктор копии, но также означает, что если вы копируете объект, копия и оригинал будут одинаковыми.

Однако ваш объект напоминает семантику конструктора перемещения. То есть после перемещения новый объект владеет ресурсом, а старый объект пуст. Это не поддерживается deque в C++ 03. Это, кстати, та же причина, по которой auto_ptr запрещается помещать в контейнер.

Следующая версия C++, называемая C++ 0x, будет поддерживать эту семантику перемещения путем введения специальных конструкторов перемещения. До тех пор вам придется использовать объект, которому принадлежит акции, если вы хотите поместить его в стандартный контейнер. Это означает, что если вы копируете свой объект, а оригинал выходит за пределы области видимости, принадлежащий ему ресурс не освобождается до тех пор, пока все копии не выйдут из области видимости. Подумайте об использовании, например, boost :: shared_ptr или оберните его в свой класс, если вы не хотите программировать свой собственный класс, управляющий этим.

greg, я имел в виду C++ 1x (не выйдет раньше 2010 года). но я принимаю ваше редактирование, потому что некоторые люди называют это C++ 0x, даже небольшая группа людей (хотя, растущая) называет это C++ 1x :)

Johannes Schaub - litb 14.01.2009 01:56

В других кругах думают, что стандартом будет C++ 0b или C++ 0c! :)

Richard Corden 14.01.2009 12:38

Вы не можете делать то, что пытаетесь сделать. Вам нужно будет использовать указатели, простые или умные (но не auto_ptr <>). Почему нельзя использовать интеллектуальные указатели Boost? Они довольно легкие и должны работать во всех достаточно стандартных компиляторах C++. Необязательно использовать Boost полностью.

Если вы не делаете ничего хитрого с ресурсами (см. Другие комментарии), то создание переменной-члена, которую вы хотите изменить, изменчивый позволит вам изменить ее в константной функции.

Другие вопросы по теме