20
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

厳密な C++ 用語

Last updated at Posted at 2024-06-02

C++ の説明でしばしば登場する用語ながら言語仕様上は使われていなかったり、違う意味で使われがちな用語をまとめてみることにした。 とりあえずぱっと思いつくものを挙げているがこれから追加することもあるかもしれない。

あくまでも言語仕様内の表現を尊重するならばというものであって、必ずしもこれらの用語を使うのが誤っているという主張ではないことはお断りしておく。 文脈で理解できるカジュアルな場面で慣例として定着しているものもある。

詳しい言語仕様を調べるときは正確な用語を使ったほうが資料を見つけやすいということはありうるので知っておくのが望ましいだろうという程度のものだ。

STL (Standard Template Library)

C++ の言語仕様の中に STL という言葉はない。 元々はアレクサンドル・ステパノフが作ったライブラリが STL と名乗っていて、その一部が C++ の言語仕様に取り入れられたという経緯がある。

厳密に言えばステパノフのライブラリ、または言語仕様内でそれに由来する範囲を STL と呼ぶのが妥当そうに思うが、別の起源を持つ iostreamstring なども含めて STL と呼んでいる例も多く、何を指して STL と呼ぶかは明瞭な定義はない。

構造体

C++ に構造体はない。

ただし、クラスが条件を満たすことで特殊な性質が保証されるようになる場合があり、 C の構造体に近い性質を持つこともある。

C++ が C と連携する必要性から言語仕様が上手く辻褄合わせがされていること、 C ユーザ向けの C++ 解説だと C の仕様を起点にすることが多いといった事情から混乱が起こりがちなように思われる。

宣言と定義

しばしば宣言と定義を分けて説明している資料があるが、言語仕様上では定義は宣言の一種として規定されている。 逆に言えば定義は常に宣言でもあり、宣言としての機能を持つ。

「定義ではない宣言」について説明するときにいちいちそう書くことが煩わしいことから宣言と定義を分けて説明する慣例になっているものと思われる。

ヘッダファイル

言語仕様上はヘッダファイルという用語は使われない。 一貫してヘッダ (header) と呼んでいる。

ヘッダが必ずしもソースファイルであるとは限らず、 #include に指定するのがファイル名であるとも限らない (名前に対応づいたなんらかの内容を持つものであればよい) ということが注釈に書かれており、ファイルであると決めつけるのを避けたものと思われる。

メソッド、メンバ変数

C++ においてはメソッドという用語は用いられず、メンバ関数が正式である。 メンバ変数という用語もそこそこ定着しているが正式にはデータメンバである。

インスタンス

C++ の言語仕様上の用語としてのインスタンスは関数テンプレートから作られる関数、クラステンプレートから作られるクラスやそのメンバ関数のことである。 プログラミング用語一般ではある型に対応するオブジェクトのことをインスタンスと呼ぶことがあるが C++ の言語仕様ではそのような言い回しをしていない。

C++ ではメモリ上を占めるデータの塊 (ビットパターン) をオブジェクトといい、それを型で解釈したものを値 (value) と呼ぶ。 オブジェクトが構築されたときの lvalue の型を「有効型」と称し、オブジェクトを値として解釈するときの扱いに制限が加えられている。 いわゆる Aliasing Rule だ。

C++ の世界観ではビットパターンを記憶するメモリが広がっていてそれの読み書きをすることで計算をする形になっている。 抽象度の高い概念もこの世界観の上に立脚して体系づけられているので言語仕様の細部を理解しようとするとメモリを意識することになる。

テンプレート関数、テンプレートクラス

公式な用語は関数テンプレート、クラステンプレートである。

関数テンプレートは関数ではなく、クラステンプレートはクラスではない。 関数・クラスを生成する (instantiation) 元になるテンプレートだからテンプレートと名前が付いているという前提をわかっていれば用語の妥当性に納得しやすいだろう。

万能参照

参照が文脈によって右辺値参照か左辺値参照かが自動的に選択されることがあり、これが万能参照と呼ばれている。

言語機能の組み合わせによって結果的に起こることだということもあり、元々は直接的にこれを指す用語が言語仕様の中に無かった。 スコット・メイヤーズが著書の中で万能参照と呼んだことで万能参照という用語が定着したという経緯がある。

C++17 で転送参照 (Forwarding Reference) という用語が正式名称として与えられた。

条件式

C++ 用語では演算子 ?: を使った式を条件式という。

forwhile などで継続条件の部分に書く式を条件式と呼ぶのは誤りで、それらは単に条件 (the condition) と呼ばれている。 C ではこの継続条件の式に制御式 (controlling expression) という用語を使っているが C++ では用語を変えたようだ。

返り値・戻り値

関数から返ってくる値 (return value) のことを返り値戻り値と呼ぶことがあるが、 JIS では返却値という訳語をあてている。

完全式

full expression の訳語として完全式という用語も定着しているが JIS の訳語では完結式となっている。

オーバーフロー

以下のコードでは unsigned char で表現できる範囲より大きい値である 266 を入れているために結果は 10 に変わっている。 (char の大きさが 8 ビットではない場合は異なる結果になる可能性もあるが現代ではほぼ考えなくてよいので脇に置くことにする。)

#include <cassert>

int main(void) {
    unsigned char foo = 266;
    assert(foo == 10);
}

この挙動のことがオーバーフローとして説明されることがよくあるのだが、言語仕様上は「オーバーフローしない」と明記されている場合に当てはまる。

整数を型変換した結果として変換後の型の表現範囲に収まらない場合、そして変換後の型が符号なし整数型である場合には変換後の型の最大値に 1 を足した値で mod を取った値に調整される規則がある。

つまり、 C++ の考え方ではオーバーフローした結果として値が化けたのではなく、値がオーバーフローしない範囲に調整されるということになっている。

キャスト

C++ の仕様書中の用語の使い方ではキャストとは明示的な型変換 (をする記法) のことを指しているようで、型変換の同義語というわけではないようです。

グローバル変数

C++ の規格の中でグローバル変数という言葉はほんの数か所だけ使われているが、思わぬときに書き換えられる可能性があるものという意味合いで使われており、文法規則上の定義はない。

20
8
5

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
20
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?