Как size_type может быть целым без знака, если npos равно -1?

Если 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?

0

Решение

Спецификация C ++ требует, чтобы подписанные типы могли быть преобразованы в неподписанные типы. §4.7 / 2 гласит, что

Если тип назначения является беззнаковым, полученное значение является наименее целым числом без знака, соответствующим исходному
целое число (по модулю 2N где n — количество битов, используемых для представления типа без знака)

Это означает, что спецификация C ++ гарантирует, что -1 может быть преобразован в size_type даже если size_type без знака, и результат будет равен максимально возможному size_type потому что добавление 1 к этому числу должно вернуть 0.

4

Другие решения

В определении используется тот факт, что целые числа без знака следуют модульной арифметике, и -1 преобразует в наибольшее целое число без знака данного типа.

2

По вопросам рекламы [email protected]