This page is a snapshot from the LWG issues list, see the Library Active Issues List for more information and the meaning of Resolved status.

### 2054. `time_point` constructors need to be `constexpr`

Section: 29.6 [time.point] Status: Resolved Submitter: Anthony Williams Opened: 2011-05-13 Last modified: 2016-01-28

Priority: Not Prioritized

View all issues with Resolved status.

Discussion:

In 29.6 [time.point], `time_point::min()` and `time_point::max()` are listed as `constexpr`. However, `time_point` has no `constexpr` constructors, so is not a literal type, and so these functions cannot be `constexpr` without adding a `constexpr` constructor for implementation purposes.

Proposed resolution: Add `constexpr` to the constructors of `time_point`. The effects of the constructor template basically imply that the member function `time_since_epoch()` is intended to be `constexpr` as well.

[2012, Portland]

Resolved by adopting paper n3469.

Proposed resolution:

This wording is relative to the FDIS.

1. Alter the class template definition in 29.6 [time.point] as follows:

   >     template <class Clock, class Duration = typename Clock::duration>
   >     class time_point {
   >       […]
   >     public:
   >       // 20.11.6.1, construct:
   >       constexpr time_point(); // has value epoch
   >       constexpr explicit time_point(const duration& d); // same as time_point() + d
   >       template <class Duration2>
   >         constexpr time_point(const time_point<clock, Duration2>& t);

   >       // 20.11.6.2, observer:
   >       constexpr duration time_since_epoch() const;
   >       […]
   >     };

2. Alter the declarations in 29.6.2 [time.point.cons]:

   >     constexpr time_point();

   > > -1- Effects: Constructs an object of type `time_point`, initializing `d_` with `duration::zero()`. Such a `time_point` object represents the epoch.

   >     constexpr explicit time_point(const duration& d);

   > > -2- Effects: Constructs an object of type `time_point`, initializing `d_` with `d`. Such a `time_point` object represents the epoch `+ d`.

   >     template <class Duration2>
   >       constexpr time_point(const time_point<clock, Duration2>& t);

   > > -3- Remarks: This constructor shall not participate in overload resolution unless `Duration2` is implicitly convertible to `duration`.

   > > -4- Effects: Constructs an object of type `time_point`, initializing `d_` with `t.time_since_epoch()`.

3. Alter the declaration in 29.6.3 [time.point.observer]:

   >     constexpr duration time_since_epoch() const;

   > > -1- Returns: d_.