ホームページ  >  記事  >  バックエンド開発  >  最も厄介な解析は何ですか?C 11 でなぜそれが起こるのですか?

最も厄介な解析は何ですか?C 11 でなぜそれが起こるのですか?

Barbara Streisand
Barbara Streisandオリジナル
2024-11-01 10:55:30774ブラウズ

What's the Most Vexing Parse and Why Does It Happen in C  11?

Uniform イニシャライザと最も厄介な解析について理解する

C 11 では、Uniform イニシャライザはオブジェクトとデータ構造を初期化するための簡潔な構文を提供します。ただし、これらの使用法は、「最も厄介な解析」として知られる潜在的なあいまいさにつながる可能性があります。

最も厄介な解析

次のコード スニペットを考えてみましょう:

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

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 = Timer();

  • Timer() は関数として解釈できます。
  • auto は dv の宣言に使用されるため、その型は右側の式から推定されます。
  • Timer() が関数呼び出しとして解釈される場合Timer() はオブジェクトを返す関数ではないため、dv は int になります。
  • ただし、Timer() がオブジェクト構築として解釈される場合、dv は Timer オブジェクトになります。

int time_keeper(Timer());

  • Timer() は、一時的な Timer オブジェクトを作成すると解釈されます。
  • time_keeper の引数は次のとおりです。 Timer を返し、引数をとらない関数へのポインタ。
  • この関数は、引数として渡されると暗黙的にポインタに変換されます。
  • したがって、time_keeper の型は int(Timer (*)()).

結論:

「最も厄介な解析」シナリオでは、コンパイラーは、文脈やルールに基づいた表現。これらのルールがどのように適用されるかを理解することで、プログラマーは曖昧さを避け、明確な意図を持ってコードを書くことができます。

以上が最も厄介な解析は何ですか?C 11 でなぜそれが起こるのですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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