文、ステートメント、これらは比較的、簡単だ。簡単というのは、目次作成が簡単だという意味である。
ユーザーが個別の機能としてみている文と、規格上の文は、それほど違わない。式文や、宣言文など、普段、あまり文として意識しない文もあるにはあるが、基本的には、それほどユーザーの認識と乖離していない。
ところで、以下の文がコンパイルできないということを、前に述べた。
decltype(0)(0) ;
このコードはコンパイルできない。そもそも、このコードはなんなのかというと、実は、関数記法の型変換ではないのだ。このコードは、変数の宣言なのだ。
// int x と同じ decltype(0)(x) ; // int std::cout << typeid(x).name() << std::endl ;
なぜ、変数の宣言になるのか。それは、関数記法の型変換と、宣言文とで、文法上、曖昧になるケースが存在する。その場合は、すべて、宣言文として解釈する(たとえ、意味上のエラーになるとしても)というルールがある。そのため、宣言文になってしまう。
それを防ぐためには、括弧が必要である。
// int(0) と同じ。 (decltype(0))(0) ;
No comments:
Post a Comment