Сегодня я прошел этот SO-вопрос: Легальность реализации COW std::string в С++ 11
Самый проголосовавший ответ (35 голосов) за этот вопрос говорит:
Это не разрешено, потому что согласно стандарту 21.4.1 p6, аннулирование итераторов/ссылок разрешено только для
- в качестве аргумента любой стандартной библиотечной функции, использующей ссылку to non-const basic_string в качестве аргумента.
- Вызов не-константных функций-членов, кроме оператора [], at, front, назад, начать, rbegin, end и rend.
Для строки COW вызов неконстантного оператора [] потребует создания копировать (и недействительные ссылки), что запрещено выше. Следовательно, уже не законно иметь строку COW в С++ 11.
Интересно, действительно ли это обоснование или нет, потому что похоже, что С++ 03 имеет аналогичные требования для аннулирования итератора строки:
Ссылки, указатели и итераторы, относящиеся к элементам basic_string может быть признана недействительной следующими способами использования этого Объект basic_string:
- В качестве аргумента для функций, не являющихся членами, swap() (21.3.7.8), оператор → () (21.3.7.9) и getline() (21.3.7.9).
- Как аргумент basic_string:: swap().
- Функции вызывающих данных() и c_str().
- Вызов неконстантных функций-членов, кроме оператора [](), at(), begin(), rbegin(), end() и rend().
- После любого из вышеуказанных применений, кроме форм insert() и erase(), которые возвращают итераторы, первый вызов неконстантного элемента функции operator [](), at(), begin(), rbegin(), end() или rend().
Это не совсем то же самое, что и для С++ 11, но, по крайней мере, то же самое для части operator[]()
, которую исходный ответ принял в качестве основного обоснования. Поэтому я предполагаю, что для оправдания незаконности реализации COW std::string в С++ 11 необходимо привести некоторые другие стандартные требования. Здесь нужна помощь.
Этот вопрос SO был неактивным более года, поэтому я решил поднять это как отдельный вопрос. Пожалуйста, дайте мне знать, если это неуместно, и я найду другой способ устранить мои сомнения.