Безопасно ли использовать std :: auto_ptr в std :: map? - PullRequest
1 голос
/ 26 ноября 2011

Я знаю, что вы должны быть осторожны с автоматическими указателями (и почему), особенно с STL. Но я не вижу проблемы с этим:

std::map<T1, std::auto_ptr<T2> >;

Это безопасно?


Я вижу, как он сломался бы в std::vector, потому что время от времени ему приходится копировать свои элементы, но верно ли это для типа значения std::map?


Редактировать: Очевидно, что независимо от того, безопасно ли это, я не могу (технически) заполнить карту, но оставлю вопрос открытым для теоретических соображений. В противном случае считается закрытым.

Ответы [ 2 ]

2 голосов
/ 27 ноября 2011

Это не безопасно.Технически, std::auto_ptr не соответствует требованию CopyConstructible или Assignable , потому что копии, сделанные с помощью конструктора копирования или оператора присвоения копии auto_ptr, не эквивалентны источникукопия после операции копирования.Эти требования должны выполняться для любого типа, используемого с любым стандартным контейнером.

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

0 голосов
/ 26 ноября 2011

Все еще не безопасно. Если ничего другого, то при первом получении указателя с карты вы передадите владение и сделаете его недействительным.

Существует очень узкий допустимый вариант использования auto_ptr. Единственное, что я могу вспомнить, это когда объект хочет четко дать понять, что он берет на себя ответственность и ответственность за указатель, который вы передаете ему.

...