44 votes

Récursif de la déclaration de la variable

Je viens de voir cette magie noire en folie/ManualExecutor.h

TimePoint now_ = now_.min();

Après je grep ed l'ensemble de la bibliothèque de code source, je n'ai pas vu la définition de la variable now_ n'importe où ailleurs qu'ici. Ce qui se passe ici? Est-ce effectivement une sorte récursive déclaration de variable?

62voto

hyde Points 13720

Ce code est le plus susceptible égale à ceci:

TimePoint now_ = TimePoint::min();

Cela signifie que, min() est une méthode statique, et l'appel à l'aide d'un exemple est le même que de l'appeler comme cela, l'instance est simplement utilisé pour déterminer le type. Pas de magie noire, c'est juste deux syntaxes pour faire la même chose.

Pourquoi le code en question compile: now_ est déjà déclarée par le côté gauche de la ligne, de sorte que quand il est utilisé pour l'initialisation sur le côté droit, le compilateur sait déjà en son genre et est en mesure d'appeler la méthode statique. En essayant d'appeler les non-statique méthode devrait donner un message d'erreur (voir le commentaire de @BenVoigt ci-dessous).

Comme l'a démontré par le fait que vous avez eu à écrire cette question, la syntaxe, la question n'est pas la plus claire. Il peut être tentant si le nom de type long, et est peut-être justifiable dans une variable de membre des déclarations d'initialiseur (dont la question de code est). Dans le code à l'intérieur des fonctions, auto est la meilleure façon de réduire le nombre de redoublements.

14voto

Mikel F Points 2907

Creuser dans le code montre que le point d'évaluation est un alias pour le chrono::steady_clock::time_point, où min() est une méthode statique qui renvoie la valeur minimale autorisée durée:

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X