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

В C++ ссылка c_str() в std::string появляется следующее:

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

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

Разве не бывшее утверждение data()[i] == operator[](i) верно и для последнего?

3 ответа

Решение

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

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

а также:

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

Это главное отличие заключается в & оператор в прототипах.

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

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


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

Другими словами: будет ли std::string всегда заканчиваться нулем в C++11? Да.

Обратите внимание на разницу в скобках:

[0, размер ())

[0, размер ()]

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

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

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

Другие вопросы по тегам