「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > 最も厄介な解析: Timer() - オブジェクト呼び出しか関数呼び出しか?

最も厄介な解析: Timer() - オブジェクト呼び出しか関数呼び出しか?

2024 年 12 月 21 日に公開
ブラウズ:895

The Most Vexing Parse: Timer() - Object or Function Call?

最も厄介な解析: C 11 の曖昧さを解明する

C 11 の「最も厄介な解析」の曖昧さは、ユニフォーム初期化子を使用するときに現れます。次のコード スニペットに示されているように:

#include 

class Timer
{
public:
    Timer() {}
};

int main()
{
    auto dv = Timer(); // Ambiguity: Object or function call?
    int time_keeper(Timer()); // Ambiguity: Pointer or call?
    return 0;
}

最初の式を理解する (auto dv = Timer())

最初の式の auto キーワードは、dv の型がイニシャライザから推論されることを意味します。等号 (=) の右側。イニシャライザは、引数なしで Timer コンストラクターを呼び出し、Timer オブジェクトを返します。したがって、 dv は Timer 型のオブジェクトです。

2 番目の式を理解する (int time_keeper(Timer()))

2 番目の式では、次の理由によりあいまいさが生じます。コンパイラは、Timer() が関数呼び出しであるか、参照によって渡される Timer 型のオブジェクトであるかを判断できません。

  • If Timer() が関数呼び出しである場合、 int time_keeper(Timer()) は、Timer オブジェクトを入力として受け取り、int を返す time_keeper という関数を宣言します。
  • Timer() が Timer 型のオブジェクトの場合、次に、 int time_keeper(Timer()) は、Time_keeper という関数を宣言します。この関数は、Timer オブジェクトへのポインタを入力として受け取り、 int.

ただし、関数は引数として渡されるとポインターに減衰するため、time_keeper の真の型は int(Timer(*)()) となり、ポインターを優先して曖昧さが解決されます。 -関数の解釈。

最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3