递归变量声明

FCR*_*FCR 44 variables recursion c++11 folly

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

TimePoint now_ = now_.min();
Run Code Online (Sandbox Code Playgroud)

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

hyd*_*yde 62

该代码很可能与此相同:

TimePoint now_ = TimePoint::min();
Run Code Online (Sandbox Code Playgroud)

这意味着,min()是一个静态方法,并使用实例调用它与调用它是相同的,该实例仅用于确定类型.没有涉及黑魔法,这只是做同样事情的两种语法.

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

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

  • 从编译器的角度来看,这两种写法是等价的.在代码审查中,只有其中一个是可以接受的.我把它作为练习让读者猜猜哪一个. (21认同)
  • @CodyGray是的,每个人都知道你对四点邪恶的仇恨.合理的Cody:有时`::`是最好的选择! (12认同)
  • 初始化程序的非静态案例值计算的分析在复制构造函数调用之前被排序(此语法是复制初始化),因此构造函数尚未开始执行,因此对象的生命周期尚未开始.标准的第3.8节说"在对象的生命周期开始之前但在对象将占用的存储空间被分配之后,可以使用引用原始对象的ny glvalue,但只能以有限的方式使用.该程序尚未定义行为if:glvalue用于调用对象的非静态成员函数." (5认同)

Mik*_*l F 14

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

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