Пробую запустить такой код
#include <iostream>
#include <string>
int main() {
std::string b("a");
std::cout << b[20];
return 0;
}
ожидал увидеть какой-то мусор в ответе, но в итоге это вешает VS(или начинает
долгую загрузку символов для combase.dll) если запустить с отладчиком. А если без то получаю Debug Assertion Failed. Как я понял из документации [] не должен проверять выход за границы. Тогда почему компилятор не может выполнить эти операции? Или т.к это undefined behavior, то стандартный компилятор VS решает эту проблему так?
Извините, что тут, но комментария мало...
QED - вот:
_NODISCARD reference operator[](const size_type _Off)
{ // subscript mutable sequence
auto& _My_data = this->_Get_data();
#if _ITERATOR_DEBUG_LEVEL >= 1
_STL_VERIFY(_Off <= _My_data._Mysize, "string subscript out of range");
#endif /* _ITERATOR_DEBUG_LEVEL >= 1 */
return (_My_data._Myptr()[_Off]);
}
из <xstring> в VC++ 2017 - вот тут и вылетает в отладочной версии, на проверке выхода за границы диапазона. В релизе этого не будет...
Продвижение своими сайтами как стратегия роста и независимости