最終更新日時: 2026年07月22日 16時08分23秒 (JST)
rotarymars が更新

履歴 編集

# sizeof演算子にクラスの非静的メンバを、オブジェクトを作らずに指定できるようにする(C++11)

このページはC++11に採用された言語機能の変更を解説しています。

のちのC++規格でさらに変更される場合があるため関連項目を参照してください。

## 概要

クラスの非静的メンバ変数のサイズを取得したい場合、そのクラスのオブジェクトを生成してから`sizeof`演算子にメンバを指定する必要があった。その制限が外され、クラスと非静的メンバ変数を、スコープ解決演算子 `::` 区切りで`sizeof`演算子に指定できるようになった：

    #include <iostream>
    #include <cstddef>

    struct X {
      int m;
    };

    int main()
    {
      const std::size_t size = sizeof(X::m);
      std::cout << size << std::endl;
    }

これができなかったバージョンでは、`sizeof(((X*)0)->m)`のような回避策がとられていた。

## 参照

- CWG Issue 198. Definition of "use" in local and nested classes
- CWG Issue 613. Unevaluated uses of non-static class members
- N2150 Extending sizeof to apply to non-static data members without an object
- N2253 Extending sizeof to apply to non-static data members without an object (revision 1)