C の統一初期化子における「最も厄介な解析」のあいまいさを理解する
「最も厄介な解析」とは、次の場合に発生する可能性のある曖昧さを指します。 C 11 の統一初期化構文を使用します。このあいまいさは、コード式がオブジェクトを初期化しているのか、オブジェクトを返す関数を呼び出しているのかが不明瞭な場合に発生します。
このあいまいさを説明するには、次のコードを考えてみましょう。
<code class="cpp">#include <iostream> class Timer { public: Timer() {} }; int main() { // Case 1: Initializing an object auto dv = Timer(); // Case 2: Calling a function int time_keeper(Timer()); return 0; }</code>
ケース 1: オブジェクトの初期化
最初のケースでは、auto dv = Timer() は dv と呼ばれる Timer 型のオブジェクトを初期化します。 auto を使用して宣言しているため、dv のタイプは Timer として推論されます。
ケース 2: 関数の呼び出し
2 番目のケースでは、int time_keeper(Timer) ()) は、int を返し、引数として Timer を返し引数をとらない関数へのポインタを取る time_keeper という関数を宣言しています。
引数が Timer (*) () ではない理由それは、関数が引数として渡されるとポインタに分解されるということです。したがって、time_keeper の型は実際には int(Timer(*)()) です。
この曖昧さは、初期化される変数の型を明示的に指定するか、関数のシグネチャを明示的に宣言することで回避できます。例:
<code class="cpp">// Explicitly specify the type of the variable auto dv: Timer = Timer(); // Explicitly declare the function's signature int time_keeper(Timer (*)());</code>
以上がC の統一初期化が「最も厄介な解析」になるのはいつですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。