Неизменяемые set-ключи в c ++ 0x, где? - PullRequest
3 голосов
/ 01 мая 2011

Я слышал в разговоре, что ключи в C ++ 0x ассоциативных контейнерах больше не являются изменяемыми . Раньше в C ++ 03 они были изменяемыми, и только в тексте Стандарта говорилось, что порядок или ключи должны оставаться неизменными.

Теперь, к счастью, это незаконно:

std::set<int> ss { 2,5,1,6,8,5,8,0,2,4,9 };
auto it = ss.find(4);
*it = 7;  // 'ERROR: assignment of read-only location'

Где это изменение отражено в C ++ 0x? Я посмотрел Final Draft, но все еще вижу, что find() и такие возвраты iterator - это звучит модифицируемо. (И почему это и нужно предположить: контейнеры типа map хотят разрешить изменение значения . Что именно изменилось, чтобы сделать key -part const?)

Ответы [ 2 ]

5 голосов
/ 01 мая 2011

Для вашей информации, 23.2.4 / 5 в N3290 гласит:

Для set и multiset значение тип совпадает с типом ключа. За map и multimap равно pair<const Key, T>. Ключи в Ассоциативный контейнер неизменен.

и 23.2.4 / 6 говорят:

Для ассоциативных контейнеров, где тип значения совпадает с ключом тип, оба iterator и const_iterator постоянны итераторы.
...
Примечание: iterator и const_iterator имеют идентичная семантика в этом случае

Эта цитата решает ваш вопрос?

1 голос
/ 01 мая 2011

По существу, iterator и const_iterator теперь определены как одинаковые. Это недостаток, конечно, не технические, но вполне допустимо, чтобы контейнеры set набирали по умолчанию iterator как const_iterator в C ++ 0x.

Для map, конечно, тогда это было pair<const K, V>, поэтому у него никогда не было проблем.

...