Если std::size_type
из std::string
это по умолчанию распределитель,
21.3.1 Шаблон класса basic_string
typedef typename allocator_traits<Allocator>::size_type size_type;
И std::size_type
для распределителя по умолчанию является то, что std::size_t
,
20.9.9 Распределитель по умолчанию
typedef size_t size_type;
И мы знаем, что std::size_t
всегда целочисленный тип без знака,
Стандарт C ++
5.3.3 Размер
Результат sizeof и sizeof … является константой типаstd::size_t
,
[Примечание: std :: size_t определяется в стандартном заголовке<cstddef>
8.2 Типы
Содержимое совпадает с заголовком библиотеки Standard C<stddef.h>
со следующими изменениями:
Стандарт C
6.5.3.4 Операторы sizeof и _Alignof
Значение результата обоих операторов определяется реализацией,
и его тип (целочисленный тип без знака)size_t
, определенный в
<stddef.h>
(и другие заголовки).
Как может станд :: basic_string :: НСС (определяется как size_type
) будет -1?
Спецификация C ++ требует, чтобы подписанные типы могли быть преобразованы в неподписанные типы. §4.7 / 2 гласит, что
Если тип назначения является беззнаковым, полученное значение является наименее целым числом без знака, соответствующим исходному
целое число (по модулю 2N где n — количество битов, используемых для представления типа без знака)
Это означает, что спецификация C ++ гарантирует, что -1 может быть преобразован в size_type
даже если size_type
без знака, и результат будет равен максимально возможному size_type
потому что добавление 1 к этому числу должно вернуть 0.
В определении используется тот факт, что целые числа без знака следуют модульной арифметике, и -1
преобразует в наибольшее целое число без знака данного типа.