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





В зависимости от того, что вы пытаетесь сделать (было бы неплохо получить более подробную информацию), вы можете либо изменить объект до / после вызова push_back, либо написать простой класс-оболочку, который принимает указатель на ваш класс и может быть вставлен в deque. Затем этот объект может делать соответствующие вещи с вашим классом при построении / разрушении / и т. д.
Вы действительно правы. Я обвинял в быстром отсутствии компилятора / стандарта в Google +, когда ответил на него. Прокляните ложную информацию в Интернете!
Ваша проблема в том, что фундаментальным требованием к стандартным контейнерам является возможность копирования объектов. Это не только означает, что у них есть конструктор копии, но также означает, что если вы копируете объект, копия и оригинал будут одинаковыми.
Однако ваш объект напоминает семантику конструктора перемещения. То есть после перемещения новый объект владеет ресурсом, а старый объект пуст. Это не поддерживается deque в C++ 03. Это, кстати, та же причина, по которой auto_ptr запрещается помещать в контейнер.
Следующая версия C++, называемая C++ 0x, будет поддерживать эту семантику перемещения путем введения специальных конструкторов перемещения. До тех пор вам придется использовать объект, которому принадлежит акции, если вы хотите поместить его в стандартный контейнер. Это означает, что если вы копируете свой объект, а оригинал выходит за пределы области видимости, принадлежащий ему ресурс не освобождается до тех пор, пока все копии не выйдут из области видимости. Подумайте об использовании, например, boost :: shared_ptr или оберните его в свой класс, если вы не хотите программировать свой собственный класс, управляющий этим.
greg, я имел в виду C++ 1x (не выйдет раньше 2010 года). но я принимаю ваше редактирование, потому что некоторые люди называют это C++ 0x, даже небольшая группа людей (хотя, растущая) называет это C++ 1x :)
В других кругах думают, что стандартом будет C++ 0b или C++ 0c! :)
Вы не можете делать то, что пытаетесь сделать. Вам нужно будет использовать указатели, простые или умные (но не auto_ptr <>). Почему нельзя использовать интеллектуальные указатели Boost? Они довольно легкие и должны работать во всех достаточно стандартных компиляторах C++. Необязательно использовать Boost полностью.
Если вы не делаете ничего хитрого с ресурсами (см. Другие комментарии), то создание переменной-члена, которую вы хотите изменить, изменчивый позволит вам изменить ее в константной функции.
Это неправда, auto_ptr использует неконстантную копию ctor для реализации (плохо) подвижной семантики.