44

folly/ManualExecutor.hでこの黒魔術を見たところです。

TimePoint now_ = now_.min();

ライブラリのソース コード全体を grep した後、ここ以外に変数の定義を見たことがありませんnow_。ここで何が起こっているのですか?これは事実上、ある種の再帰変数宣言ですか?

4

2 に答える 2

62

そのコードはおそらくこれと同じです:

TimePoint now_ = TimePoint::min();

つまり、min()は静的メソッドであり、インスタンスを使用して呼び出すことは、このように呼び出すことと同じです。インスタンスは、型を決定するためだけに使用されます。黒魔術は関係ありません。これは、同じことを行うための 2 つの構文にすぎません。

問題のコードがコンパイルされる理由についてはnow_、行の左側で既に宣言されているため、右側で初期化に使用すると、コンパイラはその型を既に認識しており、静的メソッドを呼び出すことができます。非静的メソッドを呼び出そうとすると、エラーが発生するはずです (以下の @BenVoigt のコメントを参照)。

この質問を書かなければならなかったという事実が示すように、質問の構文は最も明確ではありません。型名が長い場合は魅力的であり、おそらく初期化子を使用したメンバー変数宣言で正当化できます(質問コードです)。関数内のコードでautoは、繰り返しを減らすためのより良い方法です。

于 2016-12-07T13:45:26.137 に答える
14

コードを掘り下げると、TimePoint が chrono::steady_clock::time_point のエイリアスであることがわかります。ここで、min() は実際には最小許容期間を返す静的メソッドです。

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

于 2016-12-07T18:31:25.680 に答える