2010-09-04

よく分からない文面

関数の型を決定するために、仮引数リストの型には、変換が加えられる。その変換の一つに、

8.3.5 Functions [dcl.fct] paragraph 5

"Any cv-qualifier modifying a parameter type is deleted."

anyとはどういう事だろう。

void f( int const * const ) ;

という関数の宣言があるとする。引数の型は、int const * constである。ここから、any cv-qualifierをdeleteすると、int *である。とすれば、関数の型はvoid ( int * )となるのだろうか。いや、実際は、void ( int const * )となる。とすれば、anyというのは解せない。

似たような他の文面はどうなっているだろうか。typeidも、一部のconstを無視する。

5.2.8 Type identification [expr.typeid] paragraph 5

The top-level cv-qualifiers of the glvalue expression or the type-id that is the operand of typeid are always ignored.

ここでは、top-levelのcv-qualifier(複数可)が無視されると書いてある。

さて、もう一度文面を見直すと、Any cv-qualifierと書いてある。まてよ、名詞に複数形を表すsが付いていない。とすれば、ひとつだけ消し去るという意味であろうか。しかし、anyとあるからには、複数あるうちの、どれを消し去っても問題はないはずである。それに、top-levelのcv-qualifierにしたって、複数である。そんな問題ではないと思う。

解せない。あるいは、paremeter typeというのは、識別子の前までの完全な型名をすべてひっくるめていうのだろうか。つまり、完全な型名をTとして、もし、parameter typeが、Tに対してcv-qualifierを適用しているならば、それを消し去るという意味だろうか。

やはり、どうもそう考えるしかなさそうである。parameter typeは、decl-specifier-seq と declaratorとで決定されるとある。つまり、parameter typeをTとしたとき、もし、void f(T const parameter)となっている場合に、このconstが消されるのだろうか。

規格では、modify typeという表現は、二箇所しかみられない。ここと、8 Declarators [dcl.decl] paragraph 2にある、

The declarators specify the names of these entities and (optionally) modify the type of the specifiers

だけである。

4 comments:

  1. > "Any cv-qualifier modifying a parameter type is deleted."

    「引数の型を修飾している、いかなるcv-qualifierでも削除される」と訳します。
    もう少し日本語としてこなれた訳にするなら、
    「引数の型を修飾しているcv-qualifierはすべて削除される」と訳したほうが良いでしょう。

    「a parameter type」と単数になっているのは、ひとつのcv-qualifierが修飾できるのは、ひとつのparameter typeに限られるからです。anyは個々に着眼点があるからです。

    それで、その「modifying」は、「修飾している」です。

    「int const * const」の最初のconstはparameter typeを修飾していません。ポインターでのポイント先がconstであることを言っているだけですから。後者のconstはparameter type(int const*)がconstである、というように"修飾"しています。

    ゆえに後者のconstのみ無視して関数の型を考えますよと言うことです。

    ReplyDelete
  2. 3.9.3 の 1 に

    3.9.1 と 3.9.2 で言及された型は
    cv-unqualified型 である。

    とあり、

    cv-unqualified complete or incomplete object type
    もしくは
    void
    である
    各々の型は
    それぞれ
    3つの cv-qualified バージョン
    を持つ。

    とあるので

    int なら
    const int, volatile int, const volatile int

    int * なら
    int * const, int * volatile, int * const volatile

    const int * なら
    const int * const, const int * volatile, const int * const volatile

    volatile int * なら
    volatile int * const, volatile int * volatile, volatile int * const volatile

    const volatile int * なら
    const volatile int * const, const volatile int * volatile, const volatile int * const volatile

    が cv-qualified バージョンなので
    どの(any) cv-qualified も
    is deleted と言うことは、要するに、
    どの(any) cv-qualifiedバージョンも
    cv-unqualifeid に戻すんだから

    int const * const

    int const *
    で文面的には不思議はないかな。

    ReplyDelete
  3. 3.9.3 の 1 に

    3.9.1 と 3.9.2 で言及された型は
    cv-unqualified型 である。

    とあり、

    cv-unqualified complete or incomplete object type
    もしくは
    void
    である
    各々の型は
    それぞれ
    3つの cv-qualified バージョン
    を持つ。

    とあるので

    int なら
    const int, volatile int, const volatile int

    int * なら
    int * const, int * volatile, int * const volatile

    const int * なら
    const int * const, const int * volatile, const int * const volatile

    volatile int * なら
    volatile int * const, volatile int * volatile, volatile int * const volatile

    const volatile int * なら
    const volatile int * const, const volatile int * volatile, const volatile int * const volatile

    が cv-qualified バージョンなので、
    どの(any) cv-qualified も
    is deleted と言うことは、要するに、
    どの(any) cv-qualifiedバージョンも
    cv-unqualifeid に戻すんだから

    int const * const

    int const *
    で文面的には不思議はないかな。

    ReplyDelete
  4. 3.9.3 の 1 に

    3.9.1 と 3.9.2 で言及された型は
    cv-unqualified型 である。

    とあり、

    cv-unqualified complete or incomplete object type
    もしくは
    void
    である
    各々の型は
    それぞれ
    3つの cv-qualified バージョン
    を持つ。

    とあるので

    int なら
    const int, volatile int, const volatile int

    int * なら
    int * const, int * volatile, int * const volatile

    const int * なら
    const int * const, const int * volatile, const int * const volatile

    volatile int * なら
    volatile int * const, volatile int * volatile, volatile int * const volatile

    const volatile int * なら
    const volatile int * const, const volatile int * volatile, const volatile int * const volatile

    が cv-qualified バージョンなので、
    どの(any) cv-qualified も
    is deleted と言うことは、要するに、
    どの(any) cv-qualifiedバージョンも
    cv-unqualifeid に戻すんだから

    int const * const

    int const *
    で文面的には不思議はないかな。

    ReplyDelete

You can use some HTML elements, such as <b>, <i>, <a>, also, some characters need to be entity referenced such as <, > and & Your comment may need to be confirmed by blog author. Your comment will be published under GFDL 1.3 or later license with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.