Здравствуйте, Skorodum, Вы писали:
S>Здравствуйте, andyp, Вы писали:
A>>Как он может за что-то отвечать, если у Foo внутри mutable члены, а работают с элементами контейнера через константный указатель? Контейнер даже не будет знать о том, что внутри одного из его объектов что-то поменялось.
S>Ок, получилось воспроизвести и для этого не нужны никакие потоки, но(!) только ипользуя функцию at, про которую явно сказано, что она только для чтения и никогда не делает глубокую копию.
Можно просто constData использовать и читать по указателю.
Ну в твоем примере это глупо, а если это, скажем, последний элемент, подтянутый из БД и закэшированный внутри класса? Const у методов означает семантическую константность, а не битовую. Для синхронизации важна битовая.
A>>Константный доступ тоже может требовать синхронизации, а тут эти две вещи спарены. Говорил же, ошибки дизайна имхо.
S>Если преднамеренно абьюзить константность и мутабельность, то много где чего сломать можно
Ну не знаю. Имхо, именно разработчики контейнера слепили требования к синхронизации и константность. Они считают, что константный доступ не должен требовать синхронизации.
S>P.S. Код из разряда тупых головоломок на собеседование...
Для ж чего еще форум? Чтобы нечто потыкать палочкой и получше самому разобраться с помощью коллег. Мой пример головоломки на собеседовании — это поведение метода capacity() у QVector. Сделал нечто, приведшее к тому, что твой конкретный вектор отцепился от общего буфера, и у тебя внезапно capacity изменилась. Можно написать трехстрочник и спрашивать, что в нем не так