とくにあぶなくないRiSKのブログ

危ないRiSKのブログだったかもしれない。本当はRiSKだけどググラビリティとか取得できるIDの都合でsscriskも使ったり。

typedefを使った関数定義(2)

前回のエントリでコメントいただきました。みなさんありがとうございます。
関数のtypedefには規格上制限/制約があるようです。
規格の中で具体例も挙がっていましたので引用します。

JISX3010:2003

6.9.1  関数定義   
構文規則 
        関数定義: 
                宣言指定子列   宣言子   宣言並びopt   複合文 
        宣言並び: 
                宣言 
                宣言並び   宣言 
制約  関数定義で宣言する識別子(その関数の名前)の型が関数型であることは,その関数定義の宣言子
の部分で指定しなければならない(137)。
(137)  これは,関数定義の型をtypedefから受け継ぐことはできないことを意味する。 
         typedef int F(void);    //  型F は“仮引数をもたず,int を返す関数” 
        F f, g;        // f とg はいずれもF と適合する型をもつ 
        F f { /* ... */ }    //  誤:構文エラー/制約違反 
        F g() { /* ... */ }    //  誤:g が関数を返すことになる 
        int f(void) { /* ... */ }  //  正:f はF と適合する型をもつ 
        int g() { /* ... */ }    //  正:g はF と適合する型をもつ 
        F *e(void) { /* ... */ }   // e は関数へのポインタを返す 
        F *((e))(void) { /* ... */ }  //  同上,括弧は無関係 
        int (*fp)(void);    // fp は型F の関数を指す 
        F *Fp;        // Fp は型F の関数を指す