std::chrono::time_point
не имеет конструктора , который принимает произвольный тип продолжительности в качестве параметра шаблона. Конструктор, который принимает system_clock::time_point::duration
, создает момент времени с его свойством time_since_epoch()
, установленным в указанный аргумент, то есть созданный момент времени представляет время, которое является указанной продолжительностью после его "эпохи".
Если это ваше намерение, вы можете использовать duration_cast
, чтобы привести значение наносекунды к system_clock::time_point::duration
:
using namespace std::chrono;
nanoseconds nano(1234567);
system_clock::time_point time(
duration_cast<system_clock::duration>(nano));
Или вы можете построить system_clock::time_point
с длительностью ноль (то есть момент времени, представляющий эпоху), а затем добавить к этому значение вашей наносекунды; результатом является новый момент времени:
system_clock::time_point epoch;
system_clock::time_point time = epoch + nano;
Как указывает Говард Хиннант, стандарт не гарантирует какой-либо конкретной точности для std::chrono::system_clock::duration
, т. Е. Системные часы не могут измерять интервалы, такие как наносекунды. В моей системе (Linux x86_64, gcc 7.3 / glibc 2.20) точность длительности составляет 1 наносекунду, но на других платформах она может составлять 1 микросекунду или меньше. На такой платформе результат duration_cast<system_clock::duration>(nanoseconds(1))
равен нулю, поскольку duration_cast
округляет до нуля .
(Обратите внимание, что даже если точность равна 1 наносекунде, точность , вероятно, не равна! Это еще одна тема.)