Я знаю, что в C ++ 98 ни std::basic_string<>
, ни std::vector<>
не требовалось использовать непрерывное хранилище. Это было воспринято как недосмотр для std::vector<>
, как только на это указали, и, если я правильно помню, было исправлено с помощью C ++ 03.
Я кажется помню, что читал об обсуждениях, требующих std::basic_string<>
использования непрерывного хранилища, когда C ++ 11 все еще назывался C ++ 0x, но я не следил внимательно за обсуждением тогда, и все еще ограничен C ++ 03 на работе, поэтому я не уверен, что с этим стало.
Итак, требуется ли std::basic_string<>
использовать непрерывное хранилище? (Если да, то какая версия стандарта потребовала этого в первую очередь?)
На случай, если вам интересно: это важно, если у вас есть код, передающий результат &str[0]
функции, ожидающей записи в непрерывный кусок памяти. (Я знаю про str.data()
, но по очевидным причинам старый код его не использует.)
str.data()
должен быть постоянным временем и должен возвращать непрерывный блок памяти, я бы сказал, что да. - person Šimon Tóth   schedule 14.10.2015data()
? Эта функция также присутствовала в C ++ 03. - person Angew is no longer proud of SO   schedule 14.10.2015str.data()
вернулconst char*
. - person sbi   schedule 14.10.2015[]
в терминахdata()
, даже для неконстантной перегрузки! - person Angew is no longer proud of SO   schedule 14.10.2015std::basic_string
реализации; любой, кто интересовался этим, вероятно, добавил бы его как отдельный STLrope
двойник. Итак, на практике, если бы я был на вашем месте, я бы просто взглянул на стандартные библиотеки C ++ 03 вашей работы (если параноик), а затем код в предположении, что они всегда будут смежными. - person Tony Delroy   schedule 14.10.2015str.data()
вернулconst char*
Изменилось ли это в C ++ 11? Такое чувство, будто я чего-то упускаю ... - person atkins   schedule 14.10.2015operator[]
и одно дляc_str
(не знаю, зачем кому-либо из разработчиков это делать). Это по-прежнему соответствует требованию постоянного времениc_str
. Если вы посмотрите на страницу cppreference, вы увидите, чтоdata() + i
не требовалось, чтобы он был равен&operator[](i)
в 03. - person sbabbi   schedule 14.10.2015