свойства std :: map - стандартные требования C +? - PullRequest
2 голосов
/ 02 ноября 2011

Здравствуйте и хорошего вам дня.

Верно ли это (требуется по стандарту), что стандартный класс C ++ std::map<Key, Value> должен иметь следующие свойства:

  • Может работать, если Значение не имеет operator= или operator= является личным (и std::map не является личным другом Значение ).
  • Может работать, если Значение не имеет конструктора по умолчанию или конструктор по умолчанию является закрытым (и std::map не является частным другом Значение )

Почему я спрашиваю - меня попросили написать замену для класса, который внутренне использовал std :: map. В процессе оказалось, что класс должен работать без operator= (до тех пор, пока вы избегаете map[key] = value;). Я обстрелял требование operator=, но оказалось, что использование конструкторов по умолчанию для Value также вызывало некоторые проблемы (o_O), потому что класс, который должен был быть Value , не имел конструкторов по умолчанию , Итак ... это стандартные свойства std::map, или исходный класс полагался на специфичное для реализации / неопределенное поведение? Я проверил «Стандарт C ++ - ANSI ISO IEC 14882 2003» и не смог найти ни одного из таких требований. Я, вероятно, могу также указать «требование конструктора по умолчанию» (пока пользователь избегает определенных вызовов, таких как вызов map[key] для несуществующего ключа), но я, конечно, не слышал о таких свойствах std :: map раньше .. .

Так ... что ты думаешь?

1 Ответ

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

Из моего прочтения Стандарта ( 23.2.4 [associative.reqmts] в C ++ 11, но уже удерживался в C ++ 03), V было DefaultConstructible и V, являющиеся CopyAssignable, не являются обязательными требованиями для создания экземпляра самого контейнера, а только для использования некоторых его операций.

Однако в C ++ 03 V должно быть CopyConstructible для всех стандартных контейнеров. Безоговорочно. В C ++ 11 это требование снято, поскольку можно использовать новые методы emplace* для непосредственного создания объекта на месте.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...