我刚刚在folly/ManualExecutor.h中看到了这个黑魔法
TimePoint now_ = now_.min();
在我对整个库源代码进行 grep 处理后,now_
除了这里,我还没有在其他任何地方看到该变量的定义。这里发生了什么事?这实际上是某种递归变量声明吗?
我刚刚在folly/ManualExecutor.h中看到了这个黑魔法
TimePoint now_ = now_.min();
在我对整个库源代码进行 grep 处理后,now_
除了这里,我还没有在其他任何地方看到该变量的定义。这里发生了什么事?这实际上是某种递归变量声明吗?
该代码很可能等于:
TimePoint now_ = TimePoint::min();
也就是说,min()
是一个静态方法,使用实例调用它和这样调用它是一样的,实例只是用于确定类型。不涉及黑魔法,这只是做同一件事的两种语法。
至于为什么有问题的代码编译:now_
在该行的左侧已经声明了,所以当它用于右侧的初始化时,编译器已经知道它的类型并且能够调用静态方法。尝试调用非静态方法应该会出错(参见下面@BenVoigt 的评论)。
正如您必须编写此问题的事实所证明的那样,问题中的语法并不是最清楚的。如果类型名称 long 可能很诱人,并且在使用初始化程序(问题代码是)的成员变量声明中可能是合理的。在函数内部的代码中,auto
是减少重复的更好方法。
深入代码显示 TimePoint 是 chrono::steady_clock::time_point 的别名,其中 min() 确实是返回最小允许持续时间的静态方法: