http://eel.is/c++draft/time.duration#2
Rep
должен быть арифметическим c типом или классом, имитирующим арифметический c тип.
http://eel.is/c++draft/time.duration#1
constexpr duration() = default;
Вместе они говорят, что duration
инициализирован по умолчанию как Rep
is default-initialized
http://eel.is/c++draft/dcl.init#7
To default-initialize объект из тип T
означает:
Если T
является (возможно, cv-квалифицированным) типом класса ([class]), рассматриваются конструкторы. Применимые конструкторы перечисляются ([over.match.ctor]), и лучший для инициализатора () выбирается с помощью разрешения перегрузки ([over.match]). Выбранный таким образом конструктор вызывается с пустым списком аргументов для инициализации объекта. (7.2)
Если T
является типом массива, каждый элемент инициализируется по умолчанию.
В противном случае инициализация не выполняется.
Таким образом:
seconds s; // no initialization.
Однако это:
seconds s{}; // zero-initialize
выполняет инициализацию значения , что для скаляров равно инициализация нуля .
http://eel.is/c++draft/dcl.init#list -3.11
В противном случае, если в списке инициализатора нет элементов, объект инициализируется значением.
http://eel.is/c++draft/dcl.init#8
Инициализировать значение объекта типа T означает:
- , если T является (возможно, cv-квалифицированным) типом класса ([class]), тогда ...
- в противном случае объект инициализируется нулями.
http://eel.is/c++draft/dcl.init#6
Для инициализации нуля объекта или ссылки типа T означает:
- , если T является скалярным типом, объект инициализируется значением, полученным путем преобразования целочисленного литерала 0 (ноль) в T; 90
Таким образом, duration
клиенты имеют выбор: неинициализированный или нулевой начальный. со стандартным значением duration
s, которые гарантированно имеют подписанный интеграл Rep
. Если вы используете пользовательскую длительность с типом класса Rep
, тогда он будет инициализирован по умолчанию по определению , за которым следует Rep
.