std::string operator[]

152
15 декабря 2020, 18:10

Пробую запустить такой код

#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 решает эту проблему так?

Answer 1

Извините, что тут, но комментария мало...

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 - вот тут и вылетает в отладочной версии, на проверке выхода за границы диапазона. В релизе этого не будет...

READ ALSO
Два socket в одном потоке

Два socket в одном потоке

Пишу сервер на qtВопрос такой, могу ли я по очереди проинициализировать два socket и использовать их вместе

108
Как описать деструктор?

Как описать деструктор?

Есть класс List и класс NodeКак я не пытался описать деструкторы, методы del_first и del_last работают некорректно

99
Выровнять блок по центру контейнера

Выровнять блок по центру контейнера

Товарищи подскажите, как выровнять блок меню по центру который большей ширины контейнера в котором он лежит

135
Присвоить ID placeholder&#39;y

Присвоить ID placeholder'y

Можно ли как-то присвоить id плейсхолдеру? Нужно чтобы он динамически изменялся, в зависимости от выбранной валютыСейчас выглядит так:

125