Объявление рекурсивной переменной

Я только что видел эту черную магию в безумии / ManualExecutor.h

TimePoint now_ = now_.min();

После того, как я собрал весь исходный код библиотеки, я не увидел определения переменной now_ где-нибудь еще, чем здесь. Что тут происходит? Действительно ли это своего рода объявление рекурсивной переменной?

2 ответа

Решение

Этот код, скорее всего, равен этому:

TimePoint now_ = TimePoint::min();

Это означает, min() является статическим методом, и вызов его с использованием экземпляра аналогичен вызову этого, этот экземпляр используется только для определения типа. Никакой чёрной магии не существует, это всего лишь два синтаксиса для того же.

Что касается того, почему рассматриваемый код компилируется: now_ уже объявлено с левой стороны строки, поэтому, когда он используется для инициализации с правой стороны, компилятор уже знает его тип и может вызывать статический метод. Попытка вызова нестатического метода должна привести к ошибке (см. Комментарий @BenVoigt ниже).

Как показывает тот факт, что вы должны были написать этот вопрос, синтаксис в вопросе не самый понятный. Это может быть заманчиво, если имя типа длинное, и, возможно, оправдано в объявлениях переменных-членов с помощью инициализатора (который является кодом вопроса). В коде внутри функций auto это лучший способ уменьшить повторение.

Копание в коде показывает, что TimePoint является псевдонимом для chrono:: stable_clock:: time_point, где min() действительно является статическим методом, который возвращает минимально допустимую длительность:

http://en.cppreference.com/w/cpp/chrono/time_point/min

Другие вопросы по тегам