C++では、不変性(immutability)を実現するための機能がいくつかあります。ここでは、その主要な機能と、C++の歴史におけるこれらの機能の進化について説明します。

const キーワード

編集

C++の不変性の基本的な手段は、const キーワードです。これにより、変数の値が変更されないことを保証できます。

const メンバー関数

編集

クラスのメンバー関数に const を指定すると、その関数はオブジェクトの状態を変更しないことを保証します。

class MyClass {
    int value;
  public:
    auto getValue() const -> int {
        return value;
    }
};

const メンバー変数

編集

クラスのメンバー変数を const として宣言すると、その変数はオブジェクトの初期化後に変更されることはありません。

class MyClass {
  public:
    MyClass(int val) : value{val} {}
  private:
    const int value;
};

constexpr

編集

C++11で導入された constexpr は、コンパイル時に評価される定数式を指定するためのものです。これにより、より強力な不変性を提供できます。

constexpr int square(int x) {
    return x * x;
}

constexpr int value = square(5);  // コンパイル時に計算される

immutable キーワードの不在

編集

C++には、他の言語(例えばD言語)のような immutable キーワードは存在しません。しかし、constconstexpr を組み合わせて使うことで、類似の不変性を実現できます。

std::optional および std::variant

編集

C++17で導入された std::optionalstd::variant も不変性の概念に関連しています。これらはコンパイル時に型安全な方法で値の有無や複数の型を管理するためのものです。

#include <optional>

std::optional<int> maybeGetValue(bool getValue) {
    if (getValue) {
        return 42;
    } else {
        return std::nullopt;
    }
}

constinit

編集

C++20では、新しいキーワード constinit が導入されました。これにより、静的初期化が保証される変数を宣言できます。

constinit int x{42};

consteval

編集

同じくC++20で導入された consteval は、常にコンパイル時に評価される関数を定義するためのものです。

consteval int getFive() {
    return 5;
}

constexpr int value = getFive();

まとめ

編集

C++の不変性に関する機能は、主に constconstexprconsteval、および constinit といったキーワードを通じて提供されています。これらの機能は、C++11以降の標準で強化されてきました。これにより、開発者はより安全で予測可能なコードを書くことができるようになっています。