std::string
не является массивом.Это объект, интерфейс которого похож на массив (а именно, обеспечивает operator[]
).Но на этом сходство заканчивается.
Даже если мы на секунду предположим, что std::string
- это просто оболочка, построенная поверх обычного массива, то для того, чтобы получить указатель «один за другим»для сохраненной последовательности вы должны сделать что-то вроде &arg.second[0] + t.end
, т. е. вместо прохождения через интерфейс std::string
сначала перейдите в область обычных указателей и используйте обычную низкоуровневую арифметику указателей.
Однакодаже это предположение неверно и что-то вроде &arg.second[0] + t.end
- это путь к катастрофе.std::string
не гарантирует сохранение контролируемой последовательности в виде массива.Не гарантируется, что он будет храниться постоянно, а это означает, что независимо от того, куда указывают ваши указатели, вы не можете предполагать, что сможете выполнять итерацию от одного к другому, используя арифметику указателей.
Если вы хотите использоватьstd::string
в некоторых устаревших интерфейсах на основе указателей у вас есть только один выбор - использовать метод std::string::c_str()
, который сгенерирует непостоянную копию контролируемой последовательности на основе массива.
PS Примечание,Кстати, в оригинальных спецификациях C и C ++ запрещено использовать метод &a[N]
для получения указателя «один за другим» даже для обычного встроенного массива.Вы всегда должны убедиться, что вы не используете оператор []
с индексом конца года.Легальный способ получить указатель всегда был что-то вроде a + N
или &a[0] + N
, но не &a[N]
.Последние изменения легализовали и подход &a[N]
, но, тем не менее, изначально он не был легальным.