我刚刚在 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的评论)。
正如你不得不提出这个问题的事实所示,问题中的语法并不是最清晰的。如果类型名称很长,在成员变量声明中使用这种语法可能很诱人,而且可能在具有初始值设定项(如问题代码)的成员变量声明中是可行的。在函数内部的代码中,auto
是减少重复的更好方式。
::
是最好的选择! - Yakk - Adam Nevraumontauto
不可用。 - T.C.min
是静态的。问题在于now_
实际上是某个类的非静态数据成员,而now_.min()
实际上是它的默认成员初始化器。 - T.C.
TimePoint
的文档链接,或者加上TimePoint :: min()
的声明(从.h文件中复制相关行即可,如果编译通过,则必须拥有该文件),我认为这个问题可以得到改进。 - hydeRuntime runtime = Runtime.getRuntime();
... - MD XF