IT用語集 › プログラミング › 最も厄介な構文解析

最も厄介な構文解析

プログラミング Svenska → 更新: 2026-10-22

C++ の規則で、関数宣言とも解釈できるものは、変数のつもりで書いていても必ず関数宣言として解釈される。

Widget w(); と書いてオブジェクトを作ったつもりでも、実際には「引数なしで Widget を返す関数」を宣言したことになる。Timer t(Clock()); はさらにひどく、Clock を返す関数へのポインタを引数に取る関数の宣言になる。文法がそう要求し、コンパイラは律儀に従う。

厄介なのは、エラーが宣言の場所ではなく変数を使った場所に出て、しかも「式はクラス型でなければならない」といった原因から遠い文言になる点だ。この現象は Scott Meyers が『Effective STL』で命名した。C++11 以降の対策は波括弧初期化で、Widget w{}; なら曖昧さがない。この構文を使うべき最も実用的な理由と言える。

← 用語集に戻る