Подтвердить что ты не робот

Разница в спецификации функции c_str между С++ 03 и С++ 11

В С++ reference c_str() в std::string появляется следующее:

Возвращаемое значение
Указатель на базовое хранилище символов.
data()[i] == operator[](i) for every i in [0, size()) (до С++ 11)
data() + i == &operator[](i) for every i in [0, size()] (поскольку С++ 11)

Я не понимаю разницу между ними, за исключением увеличения диапазона на один элемент с С++ 11.

Не является ли прежнее утверждение data()[i] == operator[](i) истинным для последнего?

4b9b3361

Ответ 1

За исключением приращения диапазона на один элемент с С++ 11, все еще существует большая разница между:

data()[i] == operator[](i)

и

data() + i == &operator[](i)

Это основное отличие - это оператор & в прототипах.

Старый прототип, разрешенный для копирования, когда будет выполняться операция записи, поскольку возвращаемый указатель может указывать на другой буфер, кроме того, который содержит исходную строку.

Другое отличие прототипов между data()[i] и data() + i не является критическим, поскольку они эквивалент.


Разница между С++ и С++ 11 заключается в том, что в первом случае std::string не был явно указан стандартом для того, будет ли он иметь нулевой ограничитель или нет. В последнем, однако, это указано.

Другими словами: Будет ли std::string всегда завершаться нулем в С++ 11? Да.

Ответ 2

Обратите внимание на разницу в закрывающей скобке:

[0, size() )

[0, size() ]

В первую очередь обозначает эксклюзивный диапазон (то есть элемент в size индекс не включен), тогда как второй обозначает инклюзивный диапазон (то есть элемент с индексом size включен) До С++ в этом случае не выполнялось ограничение завершения нулевого значения, тогда как в С++ 11 доступ к символу в позиции size() четко определен.

Что касается разницы между data()[i] == operator[](i) и data() + i == &operator[](i), то второй применяет больше ограничений на потенциальную реализацию. В первом случае указатель на буфер, возвращаемый data(), может отличаться от указателя на буфер, где хранится значение, возвращаемое ссылкой operator []. Это может произойти, когда новый буфер был создан после вызова неконсолидированного оператора [] скопированной строки.

Ответ 3

До С++ 11 не указано, были ли строковые данные завершены с нулевой отметкой или нет. С++ 11 говорит, что он должен быть завершен с нулевой отметкой.