powered by simpleCommunicator - 2.0.58     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Размещение в контейнерах STL не копируемых объектов
8 сообщений из 33, страница 2 из 2
Размещение в контейнерах STL не копируемых объектов
    #39967220
Фотография AmKad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Все равно не понимаю, чего Вы хотите. Если хотите запретить копирование объекта, то запретите вызов копирующего конструктора. Вместого него определите перемещающий конструктор.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
void f() {
    class NonCopyAble {
        int n = 100500;
    public:
        NonCopyAble() : n(-1) { logDebug("default constructor %d", n); };
        NonCopyAble(int N) : n(N) { logDebug("parameter constructor %d", n); };
        NonCopyAble(NonCopyAble&& rhs) { n = rhs.n; logDebug("move constuctor %d", n); };
        NonCopyAble(const NonCopyAble&) = delete;
        NonCopyAble& operator=(NonCopyAble const&) = delete;
    };

    std::vector<NonCopyAble> vec;

    logDebug("emplace_back.."); vec.emplace_back(0);
    logDebug("emplace_back.."); vec.emplace_back(1);
    logDebug("emplace_back.."); vec.emplace_back(2);
    logDebug("resize..."); vec.resize(6);
};

Вывод:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
f                            | emplace_back..
f::NonCopyAble::NonCopyAble  | parameter constructor 0
f                            | emplace_back..
f::NonCopyAble::NonCopyAble  | parameter constructor 1
f::NonCopyAble::NonCopyAble  | move constuctor 0
f                            | emplace_back..
f::NonCopyAble::NonCopyAble  | parameter constructor 2
f::NonCopyAble::NonCopyAble  | move constuctor 0
f::NonCopyAble::NonCopyAble  | move constuctor 1
f                            | resize...
f::NonCopyAble::NonCopyAble  | default constructor -1
f::NonCopyAble::NonCopyAble  | default constructor -1
f::NonCopyAble::NonCopyAble  | default constructor -1
f::NonCopyAble::NonCopyAble  | move constuctor 0
f::NonCopyAble::NonCopyAble  | move constuctor 1
f::NonCopyAble::NonCopyAble  | move constuctor 2
...
Рейтинг: 0 / 0
Размещение в контейнерах STL не копируемых объектов
    #39967222
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AmKad,

Осталось подумать... В случае по сути POD класса различаются ли семантики копирования и перемещения? Вам не кажется, что вы семантику копирования реализовали через "перемещение"? Это как различие между синтаксической и семантической константностью.
...
Рейтинг: 0 / 0
Размещение в контейнерах STL не копируемых объектов
    #39967225
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Допустим у нас класс содержит 99-ть полей double. Нам его не нужно копировать по логике программы. Мы ему запретили копирование, но при этом разработали перемещение, которое, по сути, приводит к копированию. Вот есть ли в этом смысл? Сомнительно... Как говорят в определённых кругах: меня терзают смутные сомнения...
...
Рейтинг: 0 / 0
Размещение в контейнерах STL не копируемых объектов
    #39967431
Фотография AmKad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petrav,

Ты сам себя запутал. Мой пример вырос из твоего. Конечно, в этом случае нет смысла вкорячивать перемещение вместо копирования. Но так как ты настойчиво хотел избежать копирования, я решил, что ты хочешь добиться перемещения (ты же все-таки не зря упомянул std::string), я показал тебе, как это сделать. В конечном итоге, я не понимаю, чего ты хочешь добиться. Возможно и ты тоже.
...
Рейтинг: 0 / 0
Размещение в контейнерах STL не копируемых объектов
    #39981453
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

petravМне не нужно добавлять/удалять элементы.

Тогда назачем тебе вообще вектор?
Код: sql
1.
std::unique_pointer<NonCopyAble[]> = new NonCopyAble[N];



Кстати, а насколько эта конструкция корректна? Будет корректно выбран оператор delete[]? Насколько я помню, когда-то в Boost был тип shared_ptr_array. Я погуглил и, вроде бы, да это корректно .
...
Рейтинг: 0 / 0
Размещение в контейнерах STL не копируемых объектов
    #39981468
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petravКстати, а насколько эта конструкция корректна?

Ну, если извинить, что я забыл имя переменной и использовал инициализацию присваиванием
вместо круглых скобок, что прокатывает не с каждым компилятором, то почему бы и нет?

petravБудет корректно выбран оператор delete[]?

У параметра темплейта есть квадратные скобки, стало быть и оператор будет использоваться с
квадратными скобками.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Размещение в контейнерах STL не копируемых объектов
    #39981504
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

petravКстати, а насколько эта конструкция корректна?

Ну, если извинить, что я забыл имя переменной и использовал инициализацию присваиванием
вместо круглых скобок, что прокатывает не с каждым компилятором, то почему бы и нет?

petravБудет корректно выбран оператор delete[]?

У параметра темплейта есть квадратные скобки, стало быть и оператор будет использоваться с
квадратными скобками.

Просто я не знаю как написать такую специализацию, что бы отреагировала на квадратные скобки. :) Но раз корректно, значит пусть так и будет.
...
Рейтинг: 0 / 0
Размещение в контейнерах STL не копируемых объектов
    #39981514
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petravя не знаю как написать такую специализацию, что бы отреагировала на квадратные скобки.

Ну так посмотри как это сделано в STL. Твоя не вызывающая сочувствия IDE, безусловно,
позволит сделать это в один клик.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
8 сообщений из 33, страница 2 из 2
Форумы / C++ [игнор отключен] [закрыт для гостей] / Размещение в контейнерах STL не копируемых объектов
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]