2016-05-02 10 views
0

Если std::size_type из std::string является то, что распределитель по умолчанию,Как может size_type быть беззнаковым интегралом, если npos равно -1?

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++ Standard
5.3.3 Sizeof
результат sizeof и sizeof ... является константой типа std::size_t.
[Примечание: станд :: size_t определен в стандартном заголовочном <cstddef>

8.2 Типы
содержимое такие же, как библиотеки заголовка Стандарт C <stddef.h>, со следующими изменениями:


C Стандартная
6.5.3.4 В SizeOf и _Alignof операторы
Значение результата обоих операторов определяется реализацией,
и его тип (целое число без знака тип) size_t, определенный в <stddef.h> (и другие заголовки).

Как можно std::basic_string::npos (определяется как size_type) be -1?

+1

Это '-1' неявно преобразован в' size_type'? –

+2

Вы действительно прочитали страницу, с которой вы связались? Там в первом предложении говорится: «Это специальное значение, равное максимальному значению, представляемому типом size_type». – user463035818

ответ

4

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

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

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

+0

Итак, если бы это было 2 байта, это было бы 0xFFFF – DarthRubik

2

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

+0

Хорошо, иметь смысл. Я не думал, что вы можете построить неподписанные интегралы с отрицательными числами и полагаться на подобный поток. –