2010-02-03

C++0x本:宣言(Declarations)

C++で、宣言と言うのは、その名前が、どのいう意味を持つのか、ということを記述するものである。変数名も、関数名も、typedefも、名前空間も、すべて宣言である。さらに、その名前に、さらに意味をつけるものも、宣言の中に含まれる。

cv-qualifier, Simple type specifier, Elaborated type specifier。この辺の訳語が思い浮かばない。CV修飾子というのは、まだ分かるとしても、simpleとelaboratedに対して、一体どんな訳語をつければいいというのか。type speciferは、型指定子でいいだろうが。

asm declarationは、解説するほどの価値があるとは思えない。なにしろ、誰も使っていないからだ。インラインアセンブラを提供するコンパイラは山ほどあるが、皆、独自の文法を提供している。これは、規格の文法が、非常に使いづらいからに他ならない。

attributeは、ちょっとした問題だ。これは、新しい機能である。訳語の候補は二つしかない。「属性」か、「アトリビュート」である。音訳した方が、後々の為にはよいと思う。もはや、誰もaddressを番地と言わないように、attributeも、アトリビュートでいいように思われる。しかし、属性というのは、結構、自然に聞こえる。少なくとも、delegateを委譲と訳すよりは、自然だ。referenceの訳語として、参照が定着したように、属性でも、問題はないかもしれない。

referenceといえば、次の宣言子(Declarator)に出てくる。これは、一般的に、参照と呼ばれている。しかし、今回、lvalue referenceとrvalue referenceが入る。悩ましいところだ。リファレンスと訳してもいいのではないか。しかし、現実には、リファレンスという訳語は、あまり使われていないのが現状だ。

そういえば、argumentとparameterの違いも問題だ。これらは、日本語では、どちらも引数と訳され、英語圏でも、よく混同される。規格では、argumentというのは、関数やマクロやテンプレートに渡す、コンマで区切られた式のことだ。このことから、実引数(actual argument or actual parameter)とも呼ばれる。

これに対して、parameterというのは、関数の宣言例外ハンドラなどに記述される、引数のことをいう。よって、仮引数(formal arguments or formal parameters)とも呼ばれている。

// これは仮引数(parameter)
void f(int x, int y, int z)
{

}

int main()
{
    int a = 1 ; int b = 2 ;

    // これは実引数(argument)
    f(a, b, 123) ;
}

規格では、argumentとparameterは、明確に使い分けている。日本語の上でも、当然使い分けるべきだと思う。

しかし、subscripting(いわゆる、operator [])の適訳が、未だに思いつかないでいる。一番まともそうにおもえるのは、添字演算子だ。この言葉は、実際に使われている。しかし、私の感覚では、添字演算子と言われても、具体的に何かと言うのが、直感的に分からない。

たとえば、配列演算子というような名前なら、直感的に分かる。が、この名前は、誤解を招く。この演算子は、配列に適用するのではないのだ。ポインタに適用するのである。規格でも、ポインタに適用する場合しか記述されていない。もし、配列に適用した場合、オペランドの配列は、array-to-pointer conversionが行われ、ポインタになるので、うごくという形になっている。

C++においては、lvalue-to-rvalue conversion、array-to-pointer conversion、Function-to-pointer conversionは、非常に軽々しく行われる。ほとんどのユーザーは、その存在を意識していない。実際、この三つの型変換を、明示的に行わなければならないとしたら、コードは相当、冗長になってしまう。だから、これは仕方のないことなのだ。

2 comments:

Anonymous said...

そもそもoperatorを演算子と訳すのが間違いなのでは

江添亮 said...

では、何がいいんですかね?
音訳して、「オペレーター」でも通じるとは思いますが。