std::array::at()
принимает аргумент size_type
, который обычно определяется в терминах некоторого типа unsinged
, например std::size_t
/ unsigned long
.
Фактический аргумент -2
имеет тип signed int
, который неявно преобразуется в size_type
при переходе к at()
и становится действительным size_type
числом; но только обернутый один. См. пример .
По умолчанию вы не получаете предупреждение / ошибку компилятора для неявного преобразования. Вы должны искать опции вашего компилятора, такие как G CC s -Wconversion
, Wsign-conversion
, et c. чтобы включить эти настройки. В вашем случае на G CC, -Wsign-conversion
предупредит вас об этих преобразованиях; и в сочетании с -Werror
эти предупреждения станут ошибками.
Обратите внимание на вывод компилятора вашего кода с флагами компилятора -std=c++11 -Werror -Wsign-conversion
( live ):
Вывод компилятора:
<source>: In function 'int main()':
<source>:6:10: error: unsigned conversion from 'int' to 'std::array<int, 5>::size_type' {aka 'long unsigned int'} changes value from '-2' to '18446744073709551614' [-Werror=sign-conversion]
6 | a.at(-2)=100;
| ^~
<source>:7:13: error: unsigned conversion from 'int' to 'std::array<int, 5>::size_type' {aka 'long unsigned int'} changes value from '-2' to '18446744073709551614' [-Werror=sign-conversion]
7 | cout<<a[-2]<<endl;
| ^~
cc1plus: all warnings being treated as errors
Вот еще один пример , который имитирует то же самое.
И, в at()
, переданный аргумент проверяется по размеру массива. Здесь вы получите исключение времени выполнения типа std :: out_of_range , как описано в документации :
Если pos
находится вне диапазона из контейнера выдается исключение типа std::out_of_range
.
Вы можете посмотреть на его реализацию, предоставленную вашим компилятором, если вы так склонны к.
И, когда вы используете недопустимый индекс с оператором индекса []
например, a[-2]
, где преобразование -2
в size_type
возвращает значение с циклическим изменением, результатом будет доступ за пределами допустимого диапазона и вызовет неопределенное поведение .
Надеюсь, это объяснение поможет!