最も厄介な解析: 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 型のオブジェクトであるかを判断できません。
ただし、関数は引数として渡されるとポインターに減衰するため、time_keeper の真の型は int(Timer(*)()) であり、あいまいさは関数へのポインタの解釈を支持します。
以上が最も厄介な解析: Timer() - オブジェクト呼び出しか関数呼び出しか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。