Конструктор по умолчанию std::chrono::duration
определяется следующим образом:
constexpr duration() = default;
(Например, см. cppreference.com или источник libstdС++.)
Однако cppreference.com также говорит об этом о конструкторах constexpr
:
Конструктор constexpr должен удовлетворять следующим требованиям:
...
каждый базовый класс, и каждый нестатический член должен быть инициализирован, либо в списке инициализации конструкторов, либо в инициализаторе член-бит. Кроме того, каждый задействованный конструктор должен быть конструктором constexpr, и каждое предложение каждого инициализатора с фигурной скобкой должно быть постоянным выражением
И в случае, если я запутался в конструкторах по умолчанию, cppreference.com, кажется, говорит, что конструкторы по умолчанию появились с = default
aren ' t определяется иначе, чем неявные конструкторы по умолчанию.
Тем не менее, тип rep
для (большей) продолжительности - это целочисленный тип. Таким образом, не следует, чтобы явный конструктор по умолчанию = default
для duration
был эквивалентен
constexpr duration() {}
который, конечно, оставил бы целочисленную переменную-член типа duration::rep
неинициализированной? И, по сути, это не стандартное поведение duration
, так что значения, построенные по умолчанию, не инициализированы? (Но я не могу найти ссылку, которая прямо говорит об этом.)
Итак, как может конструктор = default
для duration
быть constexpr
, если он не инициализируется нестатической переменной-членом? Что мне не хватает?