最も厄介な構文解析
C++ の規則で、関数宣言とも解釈できるものは、変数のつもりで書いていても必ず関数宣言として解釈される。
Widget w(); と書いてオブジェクトを作ったつもりでも、実際には「引数なしで Widget を返す関数」を宣言したことになる。Timer t(Clock()); はさらにひどく、Clock を返す関数へのポインタを引数に取る関数の宣言になる。文法がそう要求し、コンパイラは律儀に従う。
厄介なのは、エラーが宣言の場所ではなく変数を使った場所に出て、しかも「式はクラス型でなければならない」といった原因から遠い文言になる点だ。この現象は Scott Meyers が『Effective STL』で命名した。C++11 以降の対策は波括弧初期化で、Widget w{}; なら曖昧さがない。この構文を使うべき最も実用的な理由と言える。