Ошибка компилятора std :: chrono :: time_point при преобразовании из переменной - PullRequest
4 голосов
/ 16 июня 2019

У меня есть переменная типа long long, представляющая момент времени в наносекундах.

Я пытаюсь обернуть его, используя std :: chrono :: time_point, но компилятор (VS 2017) доставляет мне неприятности.

вот код, который компилируется:

std::chrono::time_point<std::chrono::steady_clock> tpStart(std::chrono::nanoseconds(10ll));
std::chrono::time_point<std::chrono::steady_clock> tpEnd = std::chrono::steady_clock::now();
double d =  std::chrono::duration<double>(tpEnd - tpStart).count();

Теперь, если я переключу значение 10ll с помощью переменной, строка, вычисляющая продолжительность, не скомпилируется:

constexpr long long t = 10ll;
std::chrono::time_point<std::chrono::steady_clock> tpStart(std::chrono::nanoseconds(t));
std::chrono::time_point<std::chrono::steady_clock> tpEnd = std::chrono::steady_clock::now();
double d =  std::chrono::duration<double>(tpEnd - tpStart).count();

Вот код ошибки:

ошибка C2679: двоичный файл '-': не найден оператор, который принимает правый операнд типа 'перегруженная функция' (или нет допустимого преобразования)

Есть идеи, почему это происходит? как я могу преобразовать переменную типа long long в std :: chrono :: time_point?

1 Ответ

4 голосов
/ 16 июня 2019

TLDR: самый неприятный анализ case

prog.cc:8:59: warning: parentheses were disambiguated as a function declaration [-Wvexing-parse]
std::chrono::time_point<std::chrono::steady_clock> tpStart(std::chrono::nanoseconds(t));

Исправлено с {} вместо ()

constexpr long long t = 10ll;
std::chrono::time_point<std::chrono::steady_clock> tpStart{std::chrono::nanoseconds{t}};
std::chrono::time_point<std::chrono::steady_clock> tpEnd = std::chrono::steady_clock::now();
double d =  std::chrono::duration<double>(tpEnd - tpStart).count();

Почему это самый неприятный анализ?

std::chrono::time_point<std::chrono::steady_clock> pStart  (std::chrono::nanoseconds(t));
//                  ^^^^ Type 1 ^^^^^              ^name^      ^^^^ Type 2 ^^^^

Так что мы можем воспроизвести с:

constexpr long long t = 10ll;
int fail (double (t) );
fail = 6; // compilation error here

Почему? Давайте уберем немного шума:

int fail (double (t) );
//  <=> 
int fail (double t);
// <=>
int fail (double) ; // Most vexing parse.

Мы можем это исправить, переключившись на {}

int Ok {double {t} };
...