関数の型を決定するために、仮引数リストの型には、変換が加えられる。その変換の一つに、
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
だけである。
> "Any cv-qualifier modifying a parameter type is deleted."
ReplyDelete「引数の型を修飾している、いかなる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のみ無視して関数の型を考えますよと言うことです。
3.9.3 の 1 に
ReplyDelete3.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 *
で文面的には不思議はないかな。
3.9.3 の 1 に
ReplyDelete3.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 *
で文面的には不思議はないかな。
3.9.3 の 1 に
ReplyDelete3.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 *
で文面的には不思議はないかな。