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