C++は、ハードウェアに近い低レイヤーから大規模なアプリケーション開発まで幅広く活用されているプログラミング言語です。
その強力な機能と柔軟性を支えているのが、言語仕様によってあらかじめ定義された「予約語(キーワード)」です。
予約語はコンパイラに対して特別な意味を持つ単語であり、変数名や関数名などの識別子として利用することはできません。
C++の歴史は長く、C++11、C++14、C++17、C++20、そして最新のC++23へと進化を続ける中で、多くのキーワードが追加され、その役割も多岐にわたります。
本記事では、C++における予約語の基礎知識から、最新のC++23までに対応したキーワード一覧、そしてそれらの役割をカテゴリ別に詳しく解説します。
これからC++を学ぶ初心者の方から、最新仕様を確認したいベテランエンジニアの方まで、ぜひ参考にしてください。
C++の予約語(キーワード)とは
C++における予約語とは、言語の文法を構成するためにあらかじめ定義された単語のことです。
これらはコンパイラがプログラムの構造を解析する際の目印となるため、プログラマが独自に定義する変数、クラス、関数などの名前として使用することは禁止されています。
例えば、int は整数型を表す予約語であり、if は条件分岐を示す予約語です。
もし、int int = 10; のような記述をしようとすると、コンパイラは予約語を識別子として解釈できないため、文法エラーを発生させます。
また、C++には「予約語」とは別に、「特定の文脈で特別な意味を持つ識別子」も存在します。
これらは特定の場所(クラス定義内など)では特別な意味を持ちますが、それ以外の場所では変数名などとして使用可能です。
しかし、コードの可読性や混乱を避けるため、これらも識別子としての利用は控えるのが一般的です。
C++の予約語一覧
C++23現在、標準規格で定義されている主要なキーワードを一覧で紹介します。
C++はC言語をベースに拡張された言語であるため、多くのキーワードがC言語と共通していますが、オブジェクト指向やテンプレート、メタプログラミングのための独自のキーワードが数多く追加されています。
| カテゴリ | キーワード |
|---|---|
| 基本データ型 | bool, char, char8_t, char16_t, char32_t, double, float, int, long, short, signed, unsigned, void, wchar_t |
| 制御構文 | break, case, continue, default, do, else, for, goto, if, return, switch, while |
| 修飾子・記憶クラス | const, constexpr, consteval, constinit, extern, inline, mutable, register, static, thread_local, volatile |
| クラス・オブジェクト | class, struct, union, enum, this, friend, virtual, explicit, operator |
| アクセス指定子 | public, protected, private |
| 演算・型操作 | alignas, alignof, decltype, new, delete, sizeof, typeid, typename |
| キャスト | const_cast, dynamic_cast, reinterpret_cast, static_cast |
| 例外処理 | try, catch, throw, noexcept |
| テンプレート・制約 | template, concept, requires |
| その他 | asm, auto, export, namespace, using, true, false, nullptr |
※ C++20からはコルーチンに関連する co_await, co_return, co_yield なども追加されています。
カテゴリ別の詳細解説
ここでは、代表的なキーワードがどのような役割を果たしているのか、いくつかの主要なカテゴリに分けて深掘りしていきます。
基本データ型とリテラル
C++のプログラムでデータを扱うための最も基礎的なキーワードです。
- int, double, float, char: 数値や文字を保持するための型です。
- bool: 論理値(真偽値)を扱うための型で、
trueまたはfalseのいずれかの値を取ります。 - nullptr: C++11で導入された、型安全なヌルポインタを表すリテラルです。従来の
NULLよりも安全に使用できます。 - auto: 変数の型を初期化式から推論するために使用されます。モダンC++では頻繁に利用される非常に重要なキーワードです。
制御構文
プログラムの実行フローを制御するためのキーワードです。
- if, else: 条件によって処理を分岐させます。
- for, while, do: 繰り返し処理(ループ)を実行します。
- switch, case, default: 多方向分岐を行います。
- break, continue: ループの脱出や、次の反復へのスキップを制御します。
オブジェクト指向プログラミング
C++の最大の特徴であるオブジェクト指向に関連するキーワードです。
- class, struct: 新しい型(クラスや構造体)を定義します。C++において、両者の違いはデフォルトのアクセス権(
privateかpublicか)のみです。 - public, protected, private: クラス メンバへのアクセス制限を指定します。
- virtual: 仮想関数を宣言し、派生クラスでの多態性(ポリモーフィズム)を実現します。
- this: インスタンス自身を指すポインタです。メンバ関数内でのみ使用可能です。
修飾子とコンパイル時処理
プログラムの動作や最適化に影響を与えるキーワードです。
- const: 値が変更不可能であることを示します。
- constexpr: コンパイル時に値を決定できることを示し、定数式としての評価を可能にします。
- static: 静的記憶域期間を持つ変数を宣言したり、クラスのメンバをインスタンス間で共有させたりします。
- inline: 関数呼び出しを関数本体に置き換えるヒントをコンパイラに与え、オーバーヘッドを削減します。
特定の文脈で意味を持つ識別子
厳密には予約語ではありませんが、特定の場所で使用されると特別な意味を持つ「文脈依存のキーワード(Identifiers with special meaning)」があります。
これらは予約語ではないため、変数名として使用することも可能ですが、混乱を避けるために避けるべきです。
- override: 派生クラスのメンバ関数が、基底クラスの仮想関数を正しく再定義していることを保証します。
- final: クラスの継承や、仮想関数のオーバーライドを禁止します。
- import, module: C++20で導入されたモジュール機能に関連する識別子です。
C++20 / C++23 で追加された重要なキーワード
近年のC++の進化は非常に速く、特にC++20では強力な機能が多数追加されました。
コンセプト(Concepts)
型に制約を設けるための機能で、concept と requires が使用されます。
これにより、テンプレートのメタプログラミングが劇的に書きやすく、読みやすくなりました。
コルーチン(Coroutines)
関数の実行を一時停止し、後で再開できる機能です。
co_await: 処理を一時停止し、再開を待ちます。co_return: コルーチンから値を返します。co_yield: 呼び出し側に値を返しつつ、実行状態を保持します。
C++23の新機能:if consteval
C++20の std::is_constant_evaluated() に代わる、より直感的な文法として導入されました。
現在の実行コンテキストが定数評価(コンパイル時評価)かどうかを判定します。
実装例:モダンC++キーワードの活用
これまでに紹介したキーワードをいくつか組み合わせた、C++20/23時代の標準的なコード例を見てみましょう。
#include <iostream>
#include <concepts>
#include <vector>
// コンセプトを使用して、数値型のみを受け入れるテンプレートを定義
template <typename T>
concept Numeric = std::integral<T> || std::floating_point<T>;
class Calculator {
public:
// constexpr を使用したコンパイル時計算
// override は文脈依存のキーワードだがここでは通常のメンバとして説明
static constexpr double PI = 3.141592653589793;
// Numeric コンセプトによる制約付きのテンプレート関数
template <Numeric T>
auto add(T a, T b) const noexcept {
// auto による戻り値型推論と noexcept による例外投げない宣言
return a + b;
}
// C++23 if consteval のイメージ(実際の動作確認用)
consteval int get_constant() {
return 42;
}
};
int main() {
Calculator calc;
// auto キーワードによる型推論
auto result = calc.add(10, 20);
auto f_result = calc.add(1.5, 2.5);
std::cout << "Integer result: " << result << std::endl;
std::cout << "Float result: " << f_result << std::endl;
std::cout << "PI: " << Calculator::PI << std::endl;
// Numeric コンセプトに適合しない型(文字列など)を渡すとコンパイルエラーになる
// calc.add("test", "data");
return 0;
}
Integer result: 30
Float result: 4
PI: 3.14159
このコードでは、template, concept, constexpr, auto, noexcept といった予約語を駆使しています。
これにより、型安全性が高く、かつパフォーマンスに優れたプログラムを記述できています。
予約語に関する注意点
C++で開発を行う際、予約語に関して以下の点に注意する必要があります。
- アンダースコアで始まる識別子の回避
C++の規格では、「アンダースコア (_) + 大文字」で始まる名前や、「連続するアンダースコア (__)」を含む名前は、実装(コンパイラや標準ライブラリ)のために予約されています。
これらを自分で定義する変数名などに使うと、将来的なコンパイラのアップデートで予約語と衝突し、予期せぬエラーを引き起こす可能性があります。
- 言語バージョンによる違い
古いC++規格(C++98/03など)で書かれたコードを最新のコンパイラでビルドする場合、新しい予約語(例:concept や thread_local)を変数名として使っているとエラーになります。
レガシーコードの移行時には注意が必要です。
- マクロとの衝突
#define を使って予約語を再定義することは、極めて危険であり推奨されません。
標準ライブラリの動作を破壊する恐れがあります。
まとめ
C++の予約語は、言語の根幹を支える重要な要素です。
最新のC++23に至るまで、開発者の利便性を向上させ、より安全で効率的なコードを書くためのキーワードが次々と追加されてきました。
本記事で紹介したキーワード一覧とその役割を理解することは、C++の文法を深く理解する第一歩となります。
特にモダンC++(C++11以降)で導入された auto, constexpr, nullptr、そしてC++20以降の concept やコルーチン関連のキーワードは、現代のC++開発において欠かせない知識です。
これらの予約語を適切に使い分けることで、バグが少なく、メンテナンス性の高い洗練されたコードを記述できるようになります。
常に最新の標準規格に目を向け、新しく導入されたキーワードを自分のスキルセットに取り入れていきましょう。






