Chapter 01無料公開

size_t 型を表現するリテラルを活用しよう

Tetsuro Matsumura
Tetsuro Matsumura
2024.11.01に更新
このチャプターの目次

size_t 型が実際にどのような整数型であるかは環境依存であり、次のいずれかの型になります。

  • unsigned int
  • unsigned long
  • unsigned long long

そのため、std::max() 関数などで size_t 型の値と整数リテラルを比較する場合、環境依存の型である size_t の正体に応じて、整数リテラルのほうに適切なサフィックスを付けるか、明示的に size_t 型を指定する必要がありました。

#include <algorithm>
#include <string>

int main() {
  std::string str = "Hello, World!";
  size_t size = str.length();
//  std::max(size, 5);   // size_t は int ではないためコンパイルエラー
  std::max(size, 5ul); // size_t が unsigned long の環境なら OK
  std::max<size_t>(size, 5); // OK
}

整数リテラルのサフィックスは、例えば size_tunsigned long 型の場合は ul サフィックスを使います。しかし、size_tunsigned int 型である環境でそのコードをコンパイルすると、2 つの引数の型が一致しないためコンパイルエラーになります。このように、整数リテラルのサフィックスに頼る方法は、移植性が低いという問題がありました。

C++23 からは、size_t 型の整数リテラルを表現する新しいサフィックス uz が追加されました。 uz サフィックスは size_t の実装に合わせて unsigned intunsigned longunsigned long long に対応するため、移植性の問題が解決します。

#include <algorithm>
#include <string>

int main() {
  std::string str = "Hello, World!";
  size_t size = str.length();
  std::max(size, 5uz); // size_t 型と整数リテラルの比較。どのような環境でもコンパイル可能

  auto i = 0uz; // i は size_t 型
}

uz サフィックスの導入により、size_t 型の使い勝手が基本型に近づきました。

このチャプターの参考リンク