44

我刚刚在folly/ManualExecutor.h中看到了这个黑魔法

TimePoint now_ = now_.min();

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

4

2 回答 2

62

该代码很可能等于:

TimePoint now_ = TimePoint::min();

也就是说,min()是一个静态方法,使用实例调用它和这样调用它是一样的,实例只是用于确定类型。不涉及黑魔法,这只是做同一件事的两种语法。

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

正如您必须编写此问题的事实所证明的那样,问题中的语法并不是最清楚的。如果类型名称 long 可能很诱人,并且在使用初始化程序(问题代码是)的成员变量声明中可能是合理的。在函数内部的代码中,auto是减少重复的更好方法。

于 2016-12-07T13:45:26.137 回答
14

深入代码显示 TimePoint 是 chrono::steady_clock::time_point 的别名,其中 min() 确实是返回最小允许持续时间的静态方法:

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

于 2016-12-07T18:31:25.680 回答