Разница в спецификации функции 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 говорит, что он должен заканчиваться нулем.