递归变量声明

Recursive variable declaration

我刚刚在folly/ManualExecutor.h

中看到了这个黑魔法
TimePoint now_ = now_.min();

在我对整个库源代码进行 grep 之后,除了这里,我没有在其他任何地方看到变量 now_ 的定义。这里发生了什么事?这实际上是某种递归变量声明吗?

该代码很可能等于:

TimePoint now_ = TimePoint::min();

也就是说,min()是一个静态方法,用实例调用和这样调用是一样的,实例只是用来判断类型的。没有黑魔法,这只是做同样事情的两种语法。

至于为什么有问题的代码编译:now_已经在行的左侧声明,所以当它用于右侧的初始化时,编译器已经知道它的类型并且能够调用静态方法。尝试调用非静态方法应该会出错(请参阅下面@BenVoigt 的评论)。

正如你不得不写这个问题所证明的,问题中的语法不是最清楚的。如果类型名称很长,这可能很诱人,并且在带有初始化程序的成员变量声明中可能是合理的(问题代码是)。在函数内部代码中,auto 是减少重复的更好方法。

深入研究代码表明 TimePoint 是 chrono::steady_clock::time_point 的别名,其中 min() 确实是一个静态方法,returns 允许的最小持续时间:

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