ホームページ > バックエンド開発 > C++ > 最も厄介な解析: Timer() - オブジェクト呼び出しか関数呼び出しか?

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

Patricia Arquette
リリース: 2024-10-31 18:09:01
オリジナル
284 人が閲覧しました

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

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

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

<code class="cpp">#include <iostream>

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

int main()
{
    auto dv = Timer(); // Ambiguity: Object or function call?
    int time_keeper(Timer()); // Ambiguity: Pointer or call?
    return 0;
}</code>
ログイン後にコピー

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

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

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

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

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

ただし、関数は引数として渡されるとポインターに減衰するため、time_keeper の真の型は int(Timer(*)()) であり、あいまいさは関数へのポインタの解釈を支持します。

以上が最も厄介な解析: Timer() - オブジェクト呼び出しか関数呼び出しか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート