ホームページ  >  記事  >  バックエンド開発  >  `Timer()` はコンストラクター呼び出しですか、それとも関数呼び出しですか? C の「最も厄介な解析」のあいまいさ

`Timer()` はコンストラクター呼び出しですか、それとも関数呼び出しですか? C の「最も厄介な解析」のあいまいさ

Susan Sarandon
Susan Sarandonオリジナル
2024-11-02 13:25:30854ブラウズ

Is `Timer()` a Constructor Call or a Function Call? The

「最も厄介な解析」の曖昧さ: ユニフォーム初期化子の解明

C の領域では、「最も厄介な解析」の曖昧さが発生する可能性があります次のコードで例示されるように、均一初期化子が発生した場合:

<code class="cpp">class Timer {
public:
    Timer() {}
};

int main() {
    auto dv = Timer(); // What is Timer() ? And what type is dv?
    int time_keeper(Timer()); // This is a function right? And why isn't the argument "Timer (*) ()"?
    return 0;
}</code>

dv の解釈

行 auto dv = Timer(); では、dv の型Timer() の解釈に依存します。これは次のいずれかです:

  • Timer 型のオブジェクトをインスタンス化するコンストラクター呼び出し。
  • 均一な初期化が使用できるため、Timer 内の仮想のoperator() オーバーロードへの関数呼び出し

この場合、これはコンストラクター呼び出しを意味し、結果として dv は Timer 型のオブジェクトになります。 auto キーワードは、イニシャライザに基づいて型を推測します。

time_keeper について

行 int time_keeper(Timer()); では、time_keeper という名前の関数が宣言されています。引数は、予想されるとおり、Timer (*) () 型の関数ポインターではありません。むしろ、これはタイマーを返し、引数をとらない関数へのポインタを表します。これは次の理由によるものです。

  • 関数は、引数として渡されると暗黙的に関数へのポインターに減衰します。
  • この特定のインスタンスでは、関数呼び出しは、関数を返す関数へのポインターに減衰します。 Timer は引数を取りません。つまり、Timer(*)() です。

結論

「最も厄介な解析」のあいまいさは、混乱の可能性を浮き彫りにしますC で特定の構造を解釈するとき。このようなシナリオを正しく理解するには、均一初期化と関数減衰の概念を理解することが重要です。

以上が`Timer()` はコンストラクター呼び出しですか、それとも関数呼び出しですか? C の「最も厄介な解析」のあいまいさの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。