C++ 用語
C++ の説明でしばしば登場する用語ながら言語仕様上は使われていなかったり、違う意味で使われがちな用語をまとめてみることにした。 とりあえずぱっと思いつくものを挙げているがこれから追加することもあるかもしれない。
あくまでも言語仕様内の表現を尊重するならばというものであって、必ずしもこれらの用語を使うのが誤っているという主張ではないことはお断りしておく。 文脈で理解できるカジュアルな場面で慣例として定着しているものもある。
詳しい言語仕様を調べるときは正確な用語を使ったほうが資料を見つけやすいということはありうるので知っておくのが望ましいだろうという程度のものだ。
STL (Standard Template Library)
C++ の言語仕様の中に STL という言葉はない。 元々はアレクサンドル・ステパノフが作ったライブラリが STL と名乗っていて、その一部が C++ の言語仕様に取り入れられたという経緯がある。
厳密に言えばステパノフのライブラリ、または言語仕様内でそれに由来する範囲を STL と呼ぶのが妥当そうに思うが、別の起源を持つ iostream
や string
なども含めて STL と呼んでいる例も多く、何を指して STL と呼ぶかは明瞭な定義はない。
メソッド、メンバ変数
C++ においてはメソッドという用語は用いられず、メンバ関数が正式である。 メンバ変数という用語もそこそこ定着しているが正式にはデータメンバである。
インスタンス
C++ の言語仕様上の用語としてのインスタンスは関数テンプレートから作られる関数、クラステンプレートから作られるクラスやそのメンバ関数のことである。 プログラミング用語一般ではある型に対応するオブジェクトのことをインスタンスと呼ぶことがあるが C++ の言語仕様ではそのような言い回しをしていない。
C++ ではメモリ上を占めるデータの塊 (ビットパターン) をオブジェクトといい、それを型で解釈したものを値 (value) と呼ぶ。 オブジェクトが構築されたときの lvalue の型を「有効型」と称し、オブジェクトを値として解釈するときの扱いに制限が加えられている。 いわゆる Aliasing Rule だ。
C++ の世界観ではビットパターンを記憶するメモリが広がっていてそれの読み書きをすることで計算をする形になっている。 抽象度の高い概念もこの世界観の上に立脚して体系づけられているので言語仕様の細部を理解しようとするとメモリを意識することになる。
万能参照
参照が文脈によって右辺値参照か左辺値参照かが自動的に選択されることがあり、これが万能参照と呼ばれている。
言語機能の組み合わせによって結果的に起こることだということもあり、元々は直接的にこれを指す用語が言語仕様の中に無かった。 スコット・メイヤーズが著書の中で万能参照と呼んだことで万能参照という用語が定着したという経緯がある。
C++17 で転送参照 (Forwarding Reference) という用語が正式名称として与えられた。
条件式
C++ 用語では演算子 ?:
を使った式を条件式という。
for
や while
などで継続条件の部分に書く式を条件式と呼ぶのは誤りで、それらは単に条件 (the condition) と呼ばれている。 C ではこの継続条件の式に制御式 (controlling expression) という用語を使っているが C++ では用語を変えたようだ。
返り値・戻り値
関数から返ってくる値 (return value) のことを返り値や戻り値と呼ぶことがあるが、 JIS では返却値という訳語をあてている。
オーバーフロー
以下のコードでは unsigned char
で表現できる範囲より大きい値である 266
を入れているために結果は 10
に変わっている。 (char
の大きさが 8 ビットではない場合は異なる結果になる可能性もあるが現代ではほぼ考えなくてよいので脇に置くことにする。)
#include <cassert>
int main(void) {
unsigned char foo = 266;
assert(foo == 10);
}
この挙動のことがオーバーフローとして説明されることがよくあるのだが、言語仕様上は「オーバーフローしない」と明記されている場合に当てはまる。
整数を型変換した結果として変換後の型の表現範囲に収まらない場合、そして変換後の型が符号なし整数型である場合には変換後の型の最大値に 1 を足した値で mod を取った値に調整される規則がある。
つまり、 C++ の考え方ではオーバーフローした結果として値が化けたのではなく、値がオーバーフローしない範囲に調整されるということになっている。
Discussion