最も厄介な解析の混乱: 曖昧さの明確化
C 11 では、ユニフォーム初期化子により、「最も厄介な解析」として知られる微妙な曖昧さが導入されます。この問題を示す例を詳しく見てみましょう:
<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>
分析:
最初の行:
<code class="cpp">auto dv = Timer();</code>
2 行目:
<code class="cpp">int time_keeper(Timer());</code>
これを証明するには、次のプログラムを考えてみましょう。
<code class="cpp">#include <type_traits> struct Timer { }; int main() { int time_keeper(Timer()); static_assert( std::is_same< decltype(time_keeper), int(Timer(*)()) >::value, "This should not fire!"); }</code>
このプログラムは正常にコンパイルされ、time_keeper が関数へのポインタを引数として受け取ることを確認します。
結論として、「最も厄介な解析」の混乱は、式 Timer() が次のように解釈できるという事実から生じています。 Timer 型のオブジェクト、または Timer を返す関数への関数ポインタのいずれか。正しい解釈は、その表現が使用されるコンテキストによって異なります。
以上が\"Timer()\" は関数ですか、それともオブジェクトですか? C の「最も厄介な解析」を理解する 11.の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。