folly/ManualExecutor.hでこの黒魔術を見たところです。
TimePoint now_ = now_.min();
ライブラリのソース コード全体を grep した後、ここ以外に変数の定義を見たことがありませんnow_
。ここで何が起こっているのですか?これは事実上、ある種の再帰変数宣言ですか?
folly/ManualExecutor.hでこの黒魔術を見たところです。
TimePoint now_ = now_.min();
ライブラリのソース コード全体を grep した後、ここ以外に変数の定義を見たことがありませんnow_
。ここで何が起こっているのですか?これは事実上、ある種の再帰変数宣言ですか?
そのコードはおそらくこれと同じです:
TimePoint now_ = TimePoint::min();
つまり、min()
は静的メソッドであり、インスタンスを使用して呼び出すことは、このように呼び出すことと同じです。インスタンスは、型を決定するためだけに使用されます。黒魔術は関係ありません。これは、同じことを行うための 2 つの構文にすぎません。
問題のコードがコンパイルされる理由についてはnow_
、行の左側で既に宣言されているため、右側で初期化に使用すると、コンパイラはその型を既に認識しており、静的メソッドを呼び出すことができます。非静的メソッドを呼び出そうとすると、エラーが発生するはずです (以下の @BenVoigt のコメントを参照)。
この質問を書かなければならなかったという事実が示すように、質問の構文は最も明確ではありません。型名が長い場合は魅力的であり、おそらく初期化子を使用したメンバー変数宣言で正当化できます(質問コードです)。関数内のコードでauto
は、繰り返しを減らすためのより良い方法です。
コードを掘り下げると、TimePoint が chrono::steady_clock::time_point のエイリアスであることがわかります。ここで、min() は実際には最小許容期間を返す静的メソッドです。