关于c ++ 11:递归变量声明

Recursive variable declaration

我刚刚在《愚蠢的执行者》和《手册执行者》中看到了这种黑色魔法。

1
TimePoint now_ = now_.min();

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


该代码很可能等于:

1
TimePoint now_ = TimePoint::min();

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

关于所讨论的代码编译的原因:now_已经由行的左侧声明,所以当它用于在右侧初始化时,编译器已经知道它的类型,并且能够调用静态方法。尝试调用非静态方法时应给出错误(请参见下面@benvoigt的注释)。

正如您必须编写这个问题的事实所证明的那样,问题中的语法不是最清楚的。如果类型名太长可能很诱人,并且在带有初始值设定项的成员变量声明中可能是合理的(问题代码就是这样)。在代码内部函数中,auto是减少重复的更好方法。


深入研究代码表明,时间点是chrono::steady_clock::time_point的别名,其中min()实际上是一个静态方法,返回允许的最短持续时间:

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