Почему требования к контейнерам и итераторам C ++ указывают size_type и diff_type как целочисленные типы? - PullRequest
0 голосов
/ 04 декабря 2018

[container.requirements] указывает, что для Контейнер тип X , X::difference_type и X::size_type имеют целое число без знака типы (определяется как [basic.fundamental] / 2 ).То же самое касается различий итераторов .

По каким причинам им не разрешено быть типом перечисления или любым типом объекта?

Редактировать: Конечно, приведенные выше типы должны удовлетворять некоторым необходимым требованиям, например, поддерживать некоторые арифметические операции.Я не ожидаю, что X::size_type определено как struct Empty {}; без операторов.

Моя мотивация состоит в том, что я хочу определить X::size_type и X::difference_type как определяемые пользователем типы, чьи определенные операторы образуютаффинное пространство и поэтому отличаются от операторов, определенных для встроенных целочисленных типов.(Аффинные пробелы означают, что я определяю только те операции, которые имеют математический смысл для типов и уменьшают общие ошибки, см. Пример здесь .)

Примечание: этот вопрос не о подписанных и неподписанных.Я знаю об этом: Может ли использование неподписанного, а не подписанного int вызывать ошибки?Почему?

Один из возможных ответов, который я могу придумать, заключается в том, что пользователи могут захотеть использовать типы в качестве параметров шаблонных типов, но это все равно может работать с типами перечисления.

Редактировать : Другой возможный ответ, возможно, заключается в том, что «необходимые требования» в моем редакторе выше просто еще не определены, и было проще перейти к тому, что уже существует в стандарте.

...